perm filename DFTP.MAC[NET,MRC]7 blob sn#256202 filedate 1976-12-21 generic text, type T, neo UTF8
;<DC-USER>DFTP.MAC;2    05-DEC-76 23:06:07    EDIT BY WRB

	TITLE	DFTP  Datacomputer File Transfer Program

; Bugs/Gripes to Bug-DFTP at MIT-AI
; Current DFTP hackers:  WRB@CCA(general, TENEX, TOPS-10)
;			 MRC@MIT-AI(ITS, SU-AI, TOPS-10)

IFNDEF F.TENX,<F.TENX==1>	; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX

IFNDEF F.PCAP,<F.PCAP==0>	; 0 IF PRIVILEGED CAPABILITIES UNRESTRICTED

IFNDEF F.SAIL,<F.SAIL==0>	; -1 IF TOPS-10 VERSION FOR SAIL
IFN F.SAIL,<F.TENX==0>

IF1,<
IFL F.TENX,<PRINTX ASSEMBLING ITS VERSION>
IFE F.TENX,<IFE F.SAIL,<PRINTX TOPS-10...>
	IFN F.SAIL,<PRINTX ASSEMBLING SAIL VERSION>
>
IFG F.TENX,<PRINTX TENEX...>
IFN F.PCAP,<PRINTX PRIVILEGED CAPABILITIES RESTRICTED>
>

; ***DEFINITIONS***

	DCHOST==37
	DCSOKT==203

	DEFALO==12

	SIZBLK==200
	SIZPAG==1000

	LBSIZE==100
	SBSIZE==20

; REGISTER DEFINITIONS

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12==12
	R13==13
	R14==14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	REG1==1
	REG2==2
	REG3==3
	REG4==4

;	(COMMONLY USED REGISTERS)
	IOREG==R5
	BPREG==R6
	FLAG==R15
	UTIL==R16
	STAK==R17

;	(TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
	TCIO==R2		; IO(REGISTER)
	TCIBP==R3		; B(YTE)P(OINTER)
	TCIACB==R4		; A(DDRESSOF)C(ONTROL)B(LOCK)
	TCITLP==R5		; T(RACE)L(IST)P(OINTER)
	TCITCC==R6		; T(RACE)C(OMMAND)C(OUNTER)
	TCIPBP==R7		; P(ARALLEL)B(YTE)P(OINTER)
	TCIPCC==R10		; P(ARALLEL)C(HARACTER)C(OUNTER)
	TCISBP==R11		; S(ERIAL)B(YTE)P(OINTER)
	TCISCC==R12		; S(ERIAL)C(HARACTER)C(OUNTER)
	TCIMAC==R13		; MA(TCHES--)C(OMMANDS)
	TCIMAN==R14		; MA(TCHES--)N(ULLCHARACTER)

; MACRO DEFINITIONS

	SALL

IFL F.TENX,<DEFINE RELOC(ADDR)<LOC ADDR>>	; ABS ASSEMBLY ON ITS

DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ	STAK,ROUTIN>

DEFINE	TAIN(MSG)
<	HRRZI	REG1,MSG
	CALLR	$TAIN$>

DEFINE	TCIN(CLIST,RSTR)
<	MOVE	TCIO,[RSTR,,CLIST]
	CALLR	$TCIN$>
DEFINE	TCIL(ARG)
<	..CMCH==0
	..CMWD==0
	..CNUM==0
	..FLAG==1
	IRP ARG<
		IFG ..FLAG,<
			..CNUM==..CNUM+1
			..IDX==0
			IRPC ARG<..IDX==..IDX+1>
			IFG <..IDX-..CMCH>,<..CMCH==..IDX>>
		..FLAG==<-..FLAG>>
	IFL ..FLAG,<!!
		PRINTX BAD ARGUMENTS TO TCIN>
	..CMWD==<<<..CMCH-1>/5>+1>
	..LOC1==.
	..LOC2==..LOC1+4
	..LOC3==..LOC2+..CNUM
	RELOC ..LOC3
	..FLAG==1
	IRP ARG<
		IFG ..FLAG,<
			..IDX==0
			IRPC ARG<..IDX==..IDX+1>
			..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
			ASCII	/ARG/
			IFG ..IDX,<REPEAT ..IDX, <0>>
			..LOC3==.>
		IFL ..FLAG,<
			RELOC ..LOC2
			ARG
			..LOC2==.
			RELOC ..LOC3>
		..FLAG==<-..FLAG>>
	RELOC ..LOC1
	..LOC2
	..CNUM
	..CMCH
	..CMWD
	RELOC ..LOC3>

DEFINE	TSIN(BUFFER,BUFS,MSG,NOECHO)
<	MOVE	IOREG,[BUFFER,,5*BUFS]
	IFB <NOECHO>,< HRRZI	UTIL,MSG>
	IFNB <NOECHO>,< HRROI	UTIL,MSG>
	CALLR	$TSIN$>

DEFINE	TNIN(MSG,RADIX)
<	IFB <RADIX>,< MOVE	IOREG,[MSG,,↑D10]>
	IFNB <RADIX>,< MOVE	IOREG,[MSG,,RADIX]>
	CALLR	$TNIN$>

DEFINE	TNOUT(REG,RADIX)
<	IFN <REG1-REG>,< MOVE	REG1,REG>
	IFB <RADIX>,< HRRZI	REG2,↑D10>
	IFNB <RADIX>,< HRRZI	REG2,RADIX>
	CALLR	$NOUT$>

DEFINE	DCNOUT(REG,RADIX)
<	IFN <REG1-REG>,< MOVE	REG1,REG>
	IFB <RADIX>,< HRROI	REG2,↑D10>
	IFNB <RADIX>,< HRROI	REG2,RADIX>
	CALLR	$NOUT$>

DEFINE	PATH(STRING,FLAGS)
<	IFB <FLAGS>,< HRRZI	FLAG,STRING>
	IFNB <FLAGS>,<
		HRRI	FLAG,STRING
		HRLI	FLAG,FLAGS>
	CALLR	$PATH$>

DEFINE	SCOPY(SOURCE,DESTIN)
<	ILDB	0,SOURCE
	JUMPE	0,.+3
	IDPB	0,DESTIN
	JRST	.-3
	MOVE	SOURCE,DESTIN
	IDPB	0,SOURCE>

; SYSTEM DEPENDENT DEFINITIONS

; ((ITS))
IFL F.TENX,<
	SEARCH SITS
	LOC 150

	OPDEF THUD [.LOSE 1000]

;  Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO.  First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).

INIT:	MOVSI (JUMPA)
	HRR .JBSA##
	.BREAK 12,[400001,,]		;set start address
	SETZ 1,
	MOVE [1,,2]
	BLT 150
	.BREAK 16,100000		;return to DDT
	JRST DFTP

; I/O Channels

	TTI==1		; TTY I/O
	TTO==2
	DCI==3		; Datalanguage I/O
	DCO==4
	ICP==5		; ICP channel
	DDI==6		; Data I/O
	DDO==7
	LCI==10		; Local input
	LCO==11		; Local output
 
; ITS network definitions

%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11

DEFINE	TBIN(REG)
<	.IOT TTI,REG
	CAIN REG,15
	 MOVEI REG,12
	CAIG REG,"z"
	 CAIGE REG,"a"
	  CAIA
	   TRZ REG," ">

TBOUT==<.IOT TTO,>

DEFINE	TSOUT(STRING)
<	IRP STRING
<	MOVEI REG1,STRING
	CALLR $STRIN
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$STRIN:	BEGINR
	HRLI REG1,(POINT 7,)		; build a byte pointer
$STRI1:	ILDB REG1			; get a character from string
	JUMPE RETN(0)			; quit when done
	.IOT TTO,			; output the character
	JRST $STRI1
	ENDR

DEFINE DCBIN(REG)
<	.IOT DCI,REG
	SKIPE FLAGDD
	 .IOT TTO,REG
>

DCBOUT==<.IOT DCO,>

DEFINE	DCSOUT(STRING)
<	IRP STRING
<	MOVEI REG1,STRING
	CALLR $DSTRI
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$DSTRI:	BEGINR
	HRLI REG1,(POINT 7,)		; build a byte pointer
$DSTR1:	ILDB REG1			; get a character from string
	JUMPE RETN(0)			; quit when done
	.IOT DCO,			; output the character
	SKIPE FLAGDD			; show DATALANGUAGE?
	 .IOT TTO,
	JRST $DSTR1			; and loop for more
	ENDR
>
; (((↑↑↑)))

; (((TOPS-10)))
IFE F.TENX,<
	TWOSEG
	RELOC	400000

	OPDEF THUD [JSP FLAG,OOPS]

IFN F.SAIL,<IFNDEF TTCALL,<OPDEF TTCALL [TTYUUO]>>

	DCCHAN==1
	DDCHAN==2
	LFCHAN==3
	LDCHAN==4

; DEFINITIONS FROM "IMP.MAC"
	.IBDEV==0
	.IBSTT==1
	.IBERR==1
	.IBLCL==2
	.IBHST==3
	.IBRMT==4
	.IUSTT==0
	.IUCON==3
	.IUCLS==4
	.IULSN==5
	.IULHS==15
	.IESOF==5
	.IESKT==11
	.IEDWN==13
	.IETIM==15

DEFINE	TBIN(REG)
<	TTCALL	0,REG
	CAIE REG,175
	 CAIN REG,176
	  MOVEI REG,33
	CAILE	REG,"Z"+40
	 JRST	.+3
	CAIL	REG,"A"+40
	 SUBI	REG,40>
DEFINE	TBOUT(REG)
<	TTCALL	1,REG>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	TTCALL	3,STRING>>

DEFINE	DCBIN(REG)
<	SKIPG	DCIBUF+2
	CALLR	NUTMI
	SOS	DCIBUF+2
	ILDB	REG,DCIBUF+1
	JUMPE REG,.-4>
DEFINE	DCBOUT(REG)
<	IDPB	REG,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT>
DEFINE	DCSOUT(STRING)
<	IRP STRING
<	HRRZI	REG1,STRING
	CALLR	NUTMO>
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT>
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
	SEARCH	STENEX

	THUD==-1

DEFINE	TBIN(REG)
<	PBIN
	CAILE	REG1,"Z"+40
	 JRST	.+3
	CAIL	REG1,"A"+40
	 SUBI	REG1,40
	IFN	<REG1-REG>,< HRRZI	REG,(REG1)>>
DEFINE	TBOUT(REG)
<	IFN	<REG1-REG>,< HRRZI	REG1,(REG)>
	PBOUT>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	HRROI	REG1,STRING
	PSOUT>>

DEFINE	DCBIN(REG)
<	MOVE	REG1,DCIJFN
	BIN
	SKIPN	FLAGDD
	 JRST	.+3
	HRRZI	REG1,(REG2)
	PBOUT
	HRRZI	REG,(REG2)>
DEFINE	DCBOUT(REG)
<	MOVE	REG1,DCOJFN
	HRRZI	REG2,(REG)
	BOUT
	MOVEI	REG2,21
	MTOPR>
DEFINE	DCSOUT(STRING)
<	..IDX==1
	IRP STRING<..IDX==..IDX+2>
	SKIPN	FLAGDD
	 JRST	.+..IDX
	IRP STRING
<	HRROI	REG1,STRING
	PSOUT>
	MOVE	REG1,DCOJFN
	SETZ	REG3,
	IRP STRING
<	HRROI	REG2,STRING
	SOUT>
	MOVEI	REG2,21
	MTOPR>
>
; (((↑↑↑)))

; "<FILE"> FILE LIST(0,55,500),CAT,B=36
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),C=1
; 	    EXTENSION STRING(0,3,79),C=1
; 	    STATUS STRING(1),F=' '
; 	    CREATIONDATE STRING(1,18,79),F='?',C=1
; 	    SAVEDATE STRING(1,18,79),F='?',C=1
; 	    VERSION INTEGER
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	INDEX BYTE,V=I
; 	COUNT BYTE
; 	DATA STRING(0,497,1000000),B=36,C=COUNT
; 	CHECKSUM BYTE
;     END;
;
; "<GET"> PORT LIST(0,500),B=36,P=EOF,CHECK
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(79),F=' ',D=0
; 	    EXTENSION STRING(79),F=' ',D=0
; 	    CREATIONDATE STRING(19),F=' ',D=0
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	COUNT BYTE
; 	DATA STRING(0,437,1000000),B=36,D=0
; 	CHECKSUM BYTE
;     END;
;
; "<PUT"> PORT LIST(0,500),B=36,P=EOF,CHECK
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D=0
; 	    EXTENSION STRING(0,3,79),D=0
; 	    CREATIONDATE STRING(0,18,79),D=0
; 	    SAVEDATE STRING(0,18,79),D=0
; 	    VERSION INTEGER
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	COUNT BYTE
; 	DATA STRING(0,497,1000000),B=36,C=COUNT
; 	CHECKSUM BYTE
;     END;
;
; "<TERSE"> PORT LIST(0,500),P=EOF
;     FILE STRUCTURE,P=EOR
; 	PREFIX STRING(5),F=' '
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D='.'
; 	    EXTENSION STRING(0,3,79),D=';'
; 	    VERSION INTEGER(1,10),D='	'
; 	    LENGTH INTEGER(1,10),D='('
; 	    BYTESIZE INTEGER(1,10),D=')'
; 	END
;     END;
;
; "<VERBOSE"> PORT LIST(0,500),P=EOF
;     FILE STRUCTURE,P=EOR
; 	PREFIX STRING(5),F=' '
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D='.'
; 	    EXTENSION STRING(0,3,79),D=';'
; 	    VERSION INTEGER(1,10),D=' '
; 	    STATUS STRING(1),D='	'
; 	    CREATIONDATE STRING(1,18,79),D=' '
; 	    SAVEDATE STRING(1,18,79),D=' '
; 	    LENGTH INTEGER(1,10),D='('
; 	    BYTESIZE INTEGER(1,10),D=')'
; 	END
;     END;


; ***PROGRAM***

DFTP:
IFL F.TENX,<.SUSET [.RSNAME,,LCLSNM]>
IFE F.TENX,<JFCL>
IFGE F.TENX,<RESET>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	CALLR	S$INIT
	CALLR	D$INIT

; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
IFL F.TENX,<			; HACK FOR ITS VERSION FOR AUTOENABLE
	MOVEI UTIL,CMDM3
	.OPEN ['DSK'
	       SIXBIT/←DFTP←/
	       SIXBIT/ENABLE/]
>
	 MOVEI UTIL,CMDM2	; CAN ENABLE LATER ON
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
;	(((ITS)))
	IFL F.TENX,<
		MOVEI UTIL,CMDM2
		.SUSET [.RXUNAME,,REG1]
		.CALL [	SETZ
			SIXBIT/OPEN/
			MOVEI
			[('DSK')]
			['.FILE.']
			['(DIR) ']
			SETZ REG1]
		MOVEI UTIL,CMDM1	; NO ITS DIRECTORY
>
;	(((↑↑↑)))
;	(((TOPS-10)))
	IFE F.TENX,<
		MOVEI	UTIL,CMDM1
;		(!ENABLE!)
>
;	(((↑↑↑)))
;	(((TENEX)))
	IFG F.TENX,<
		MOVEI	UTIL,CMDM1
		MOVEI	REG1,400000	; FOR THIS FORK
		RPCAP
		TRNE	REG2,600000	; (1B18+1B19) WHEEL OR OPER
		 MOVEI	UTIL,CMDM2
>
;	(((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<.CLOSE>
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD
CMDNEW:	TSOUT	<CRLF>
CMDCMD:	JRST	@CMDMOD
CMDM1:	TSOUT	<[ASCIZ/*/]>
	TCIN	(CMDMC1,[ASCIZ/*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM2:	TSOUT	<[ASCIZ/*/]>
	TCIN	(CMDMC2,[ASCIZ/*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM3:	TSOUT	<[ASCIZ/!/]>
	TCIN	(CMDMC3,[ASCIZ/!/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
; (((ITS)))
IFL F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))

CALO:	PATH	([ASCIZ/ ALLOCATE /],PATHNR!PATHca)
	 JRST	CMDCMD
	TSOUT	<[ASCIZ/ [Megabits:/]>
	TNIN	([ASCIZ/ [Megabits:/])
	 JRST	CMDCMD
	MOVEM	IOREG,ABUF
	JUMPN	IOREG,CALO0
	MOVEI	IOREG,"0"
	TBOUT	<IOREG>
CALO0:	TSOUT	<[ASCIZ/]/],CRLF>
	CALLR	DALO
	JRST	CMDCMD

CATT:	PATH	([ASCIZ/ ATTACH /],PATHNR!PATHCT)
	 JRST	CMDCMD
	CALLR	DATT
	JRST	CMDCMD

CCHA:	PATH	([ASCIZ/ CHANGE /],PATHNR!PATHca!pathad)
	 JRST	CMDCMD
	CALLR	DCHA
	JRST	CMDCMD

CCON:	PATH	([ASCIZ/ CONNECT /],PATHNR!PATHCA!pathad)
	 JRST	CMDCMD
	CALLR	DCON
	JRST	CMDCMD

CCRE:	PATH	([ASCIZ/ CREATE /],PATHNR!PATHca)
	 JRST	CMDCMD
	CALLR	DCRE
	JRST	CMDCMD

CDEL:	PATH	([ASCIZ/ DELETE /],PATHNP!PATHFR!PATHAS!PATHAC!PATHAV)
	 JRST	CMDCMD
	CALLR	DDEL
	JRST	CMDCMD

CDIR:	PATH	([ASCIZ/ DIRECTORY /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	MOVE	IOREG,CMDMOD
	CAIN	IOREG,CMDM3
	 JRST	CDIR1
	TSOUT	<[ASCIZ/**/]>
	TCIN	(CDIRC,[ASCIZ/**/])
	 JRST	CMDCMD
	 JRST	CDIR2
	JRST	CDIR3
CDIR1:	TSOUT	<[ASCIZ/!!/]>
	TCIN	(CDIRC,[ASCIZ/!!/])
	 JRST	CMDCMD
	 JRST	CDIR2
	JRST	CDIR3
CDIR2:	MOVEI	FLAG,DD$T
	TSOUT	<[ASCIZ/TERSE/]>
CDIR3:	TSOUT	<CRLF>
	CALLR	DDIR
	JRST	CMDCMD
CDIRC:	TCIL	<TERSE,DD$T,VERBOSE,DD$V>

CDIS:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM2
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

CENA:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM3
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

; (((TENEX)))
IFG F.TENX,<
CEXE:	HRROI	REG1,CRLF
	PSOUT
	HRRZI	REG1,-1
	RFMOD
	MOVE	R10,REG2
	RFCOC
	MOVE	R11,REG2
	MOVE	R12,REG3
	HRLZI	REG1,(1B1)	; INFERIOR GETS THIS FORK'S CAPABILITIES
	CFORK			; CREATE FORK
	 THUD
	MOVE	UTIL,REG1
	HRLZI	REG1,(1B2+1B17)
	HRROI	REG2,[ASCIZ/<SYSTEM>EXEC.SAV/]
	GTJFN
	 THUD
	HRLI	REG1,(UTIL)
	GET			; LOAD EXEC INTO FORK
	MOVE	REG1,UTIL
	SETZ	REG2,
	SFRKV			; START FORK AT MAIN STARTUP
	WFORK
	KFORK
	HRRZI	REG1,-1
	MOVE	REG2,R10
	SFMOD
	MOVE	REG2,R11
	MOVE	REG3,R12
	SFCOC
	JRST	CMDCMD
>
; (((↑↑↑)))

CEXP:	PATH	([ASCIZ/ EXPUNGE /],PATHnr!pathcc!pathad!PATHAC)
	 JRST	CMDCMD
	CALLR	DEXP
	JRST	CMDCMD

CGET:	PATH	([ASCIZ/ GET /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CLIN:	TSOUT	<CRLF>
	CALLR	DLIN
	JRST	CMDCMD

CLIS:	PATH	([ASCIZ/ LIST /],PATHnr!pathcc!PATHAS)
	 JRST	CMDCMD
	MOVE	IOREG,CMDMOD
	CAIN	IOREG,CMDM3
	 JRST	CLIS1
	TSOUT	<[ASCIZ/**/]>
	TCIN	(CLISC1,[ASCIZ/**/])
	 JRST	CMDCMD
	 JRST	CLIS2
	JRST	CLIS3
CLIS1:	TSOUT	<[ASCIZ/!!/]>
	TCIN	(CLISC2,[ASCIZ/!!/])
	 JRST	CMDCMD
	 JRST	CLIS2
	JRST	CLIS3
CLIS2:	MOVEI	FLAG,DL$T
	TSOUT	<[ASCIZ/TERSE/]>
CLIS3:	TSOUT	<CRLF>
	CALLR	DLIS
	JRST	CMDCMD
CLISC1:	TCIL	<TERSE,DL$T,VERBOSE,DL$V>
CLISC2:	TCIL	<PROTECTION,DL$P,TERSE,DL$T,VERBOSE,DL$V>

; (((TOPS-10)))
IFE F.TENX,<
CLOD:	TTCALL	3,CRLF
	SETZM	LUTDSP
CLOD1:	CALLR	LUTDS
	 JRST	CMDCMD
	TTCALL	1,[" "]
	TTCALL	3,LUTDSF
	TTCALL	3,CRLF
	JRST	CLOD1
>
; (((↑↑↑)))

CNOD:	SETZM	FLAGDD
	JRST	CMDNEW

CPUT:	PATH	([ASCIZ/ PUT /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CQUI:	TAIN	<[ASCIZ/ [Confirm]/]>
	 JRST	CMDCMD
	 JRST	CMDCMD
	JRST	QUIT

CREM:	PATH	([ASCIZ/ REMOVE /],PATHnr!pathcc!PATHAS!PATHAC)
	 JRST	CMDCMD
	CALLR	DREM
	JRST	CMDCMD

CRET:	PATH	([ASCIZ/ RETRIEVE /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CSOD:	SETOM	FLAGDD
	JRST	CMDNEW

CSTO:	PATH	([ASCIZ/ STORE /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CTTR:	SETOM	FLAGTT
	JRST	CMDNEW

CUND:	PATH	([ASCIZ/ UNDELETE /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	CALLR	DUND
	JRST	CMDCMD

CUTR:	SETZM	FLAGTT
	JRST	CMDNEW


; ***PATH INPUT AND TRANSLATION***

; FLAG DEFINITIONS
	PATHNR==400000		; NODE REQUIRED
	PATHNP==200000		; NODE POSSIBLE
	PATHNF==100000		; NODE FOUND
	PATHFR==040000		; FILE REQUIRED
	PATHFF==020000		; FILE FOUND
	PATHCT==004000		; CONTEXT TOP
	PATHCA==002000		; CONTEXT ATTACH
	PATHCC==001000		; CONTEXT CONNECT
	PATHLR==000400		; LOCAL TO REMOTE
	PATHRL==000200		; REMOTE TO LOCAL
	PATHAS==000040		; ALLOW SETS
	pathad==000020		; allow (non-set) default
	PATHAV==000010		; ALLOW VERSIONS
	PATHAC==000004		; ACKNOWLEDGE [CONFIRM]

; PATH INPUT CONTROL
;   IN: TCIO -- LAST CHARACTER INPUT (TCIN)
;	FLAG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$:	BEGINR	<IOREG,UTIL>
; (((TENEX)))
IFG F.TENX,<
	TLNE	FLAG,PATHLR
	 TLO	FLAG,PATHAV
>
; (((↑↑↑)))
	MOVEI	IOREG," "
	TBOUT	<IOREG>
	MOVE	IOREG,[GBUF1,,5*LBSIZE]
	SETZ	UTIL,
	CALLR	P$IN
	 RETURN
	PUSH	STAK,IOREG
	MOVE	IOREG,[GBUF1,,NBUF]
	MOVE	UTIL,[FBUF,,EBUF]
	CALLR	P$PP
	POP	STAK,IOREG
	MOVEM	UTIL,VBUF
	TLNN	FLAG,PATHAC
	 JRST	PAT$10
	TAIN	<[ASCIZ/ [Confirm]/]>
	 RETURN
	 RETURN
	RETURN	SKIP,1
PAT$10:	TLNE	FLAG,PATHRL!PATHLR
	 JRST	PAT$11
	TSOUT	<CRLF>
	RETURN	SKIP,1
PAT$11:	PUSH	STAK,IOREG
	MOVE	IOREG,[FBUF,,EBUF]
; (((TENEX)))
IFG F.TENX,<
	TLNE	FLAG,PATHRL
	 SETZ	UTIL,
>
; (((↑↑↑)))
	CALLR	P$LF
	POP	STAK,IOREG
	CAIN	IOREG,33
	 JRST	PAT$20
	CAIN	IOREG," "
	 JRST	PAT$20
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$12:	TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$12:	SKIPE	LJFN
	 JRST	.+3
	HRROI	REG1,CRLF
	PSOUT
>
; (((↑↑↑)))
	RETURN	SKIP,1
PAT$20:	TLNE	FLAG,PATHLR
	 JRST	PAT$21
	TLNE	FLAG,PATHRL
	 JRST	PAT$22
	JRST	PAT$23
PAT$21:	TLNE	FLAG,PATHNF
	 JRST	PAT$12
; (((TENEX)))
IFG F.TENX,<
	TLZ	FLAG,PATHAV
>
; (((↑↑↑)))
	JRST	PAT$23
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$22:	TLZ	FLAG,PATHNR!PATHNP!PATHAV
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$22:	SKIPN	LJFN
	 JRST	.+4
	HRROI	REG1,CRLF
	PSOUT
	RETURN	SKIP,1
	TLZ	FLAG,PATHNR!PATHNP
>
; (((↑↑↑)))
PAT$23:	TSOUT	<[ASCIZ/ [As] /]>
	MOVE	IOREG,[GBUF2,,5*LBSIZE]
	MOVE	UTIL,[GBUF1,,[ASCIZ/ [As] /]]
	CALLR	P$IN
	 RETURN
	TLNE	FLAG,PATHLR
	 JRST	PAT$24
	TLNE	FLAG,PATHRL
	 JRST	PAT$25
	RETURN
PAT$24:	MOVE	IOREG,[GBUF2,,NBUF]
	MOVE	UTIL,[FBUF,,EBUF]
	CALLR	P$PP
	MOVEM	UTIL,VBUF
	TSOUT	<CRLF>
	RETURN	SKIP,1
PAT$25:	MOVE	IOREG,[GBUF2,,GBUF1]
	MOVE	UTIL,[FSBUF,,ESBUF]
	CALLR	P$PP
	MOVE	IOREG,[FSBUF,,ESBUF]
	CALLR	P$LF
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	SKIPE	LJFN
	 JRST	.+3
	HRROI	REG1,CRLF
	PSOUT
>
; (((↑↑↑)))
	ENDR	SKIP,1

; PATH INPUT
;   IN: IOREG -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
;       UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
;       FLAG -- (SAME AS $PATH$)
;   OUT: IOREG -- LAST CHARACTER INPUT
;        UTIL -- COUNT OF CHARACTERS
;   FLAGS:
	P$I$AE==400000		; ANCHOR ENCOUNTERED (<)
	P$I$DE==200000		; DESCENDER ENCOUNTERED (>,.)
	P$I$SE==100000		; SET ENCOUNTERED (*)
	P$I$TE==040000		; TRAILING NODE SET ENCOUNTERED (**)
	P$I$PW==010000		; INPUT PASSWORD
	P$I$CC==004000		; <
	P$I$CA==002000		; <<
	P$I$CT==001000		; <<<
	P$I$EP==000400		; EXTENSION BEING PROCESSED
	P$I$VP==000200		; VERSION BEING PROCESSED
;
P$IN:	BEGINR	<BPREG,R10,R11,R12,R13>
	SETZ	R10,
	MOVE	R11,IOREG
	MOVE	R12,UTIL
	HLR	BPREG,IOREG
	HRLI	BPREG,(point 7,)
	SETZ	UTIL,
P$ICHR:	TBIN	<IOREG>
	CAIN	IOREG,"R"-100
	 JRST	P$IREP
	CAIN	IOREG,"A"-100
	 JRST	P$IDEL
	CAIN	IOREG,"X"-100
	 JRST	P$IENR
	CAIN	IOREG,177
	 JRST	P$IENR
	CAIN	IOREG,15
	 JRST	P$ICHR
	CAIN	IOREG,12
	 JRST	P$IEND
	CAIN	IOREG,33
	 JRST	P$IEND
	CAIN	IOREG,37
	 JRST	P$IEND
	CAIGE	IOREG," "
	 JRST	P$IBAD
	CAIN	IOREG,42
	 JRST	P$IBAD
	TRNE	R10,P$I$TE
	 JRST	P$IBAD
	CAIL	UTIL,(R11)
	 JRST	P$IBAD
	TRNE	R10,P$I$PW
	 JRST	P$ICHP
	CAIN	IOREG," "
	 JRST	P$IEND
	CAIN	IOREG,"?"
	 JRST	P$IBAD
	CAIN	IOREG,"*"
	 JRST	P$ISS
	TRNE	R10,P$I$VP
	 JRST	P$ISVN
	CAIN	IOREG,";"
	 JRST	P$ISVS
	CAIN	IOREG,":"
	 JRST	P$IPON
	CAIN	IOREG,"<"
	 JRST	P$ISA
	CAIN	IOREG,">"
	 JRST	P$ISD1
	CAIN	IOREG,"."
	 JRST	P$ISD2
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TRZ	R10,P$I$AE!P$I$DE
P$ICHE:	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	AOJA	UTIL,P$ICHR
P$ICHP:	CAIN	IOREG,">"
	 JRST	P$IPOF
	CAIN	IOREG,"'"
	 JRST	P$IBAD
	IDPB	IOREG,BPREG
	AOJA	UTIL,P$ICHR
P$ISA:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	TRNN	R10,P$I$CC
	 JRST	P$ISA1
	TRNN	R10,P$I$CA
	 JRST	P$ISA2
	TRNN	R10,P$I$CT
	 JRST	P$ISA3
	JRST	P$IBAD
P$ISA1:	JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$AE!P$I$CC
	JRST	P$ICHE
P$ISA2:	CAIE	UTIL,1
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CA
	JRST	P$ICHE
P$ISA3:	CAIE	UTIL,2
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CT
	JRST	P$ICHE
P$ISD1:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE!P$I$EP
	 JRST	P$IBAD
	TLNN	FLAG,PATHFR
	 JRST	.+3
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TROE	R10,P$I$DE
	 JRST	P$IBAD
	TRZ	R10,P$I$SE
	JRST	P$ICHE
P$ISD2:	TLNN	FLAG,PATHFR
	 JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE!P$I$DE!P$I$EP
	 JRST	P$IBAD
	TRZ	R10,P$I$SE
	TRO	R10,P$I$DE!P$I$EP
	JRST	P$ICHE
P$ISVS:	TLNN	FLAG,PATHAV
	 JRST	P$IBAD
	TLNN	FLAG,PATHFR
	 JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE!P$I$VP
	 JRST	P$IBAD
	TRNN	R10,P$I$DE
	 JRST	.+3
	TRNN	R10,P$I$EP
	 JRST	P$IBAD
	TRZ	R10,P$I$SE!P$I$EP
	TRO	R10,P$I$VP!P$I$DE
	JRST	P$ICHE
P$ISVN:	CAIL	IOREG,"0"
	 CAILE	IOREG,"9"
	  JRST	P$IBAD
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TRZ	R10,P$I$DE
	JRST	P$ICHE
P$ISS:	TLNN	FLAG,PATHAS
	 JRST	P$IBAD
	TRNE	R10,P$I$SE
	 JRST	P$IST
	TRZN	R10,P$I$AE!P$I$DE
	 JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$SE
	JRST	P$ICHE
P$IST:	TLNE	FLAG,PATHFR
	 JRST	P$IBAD
	TRNE	R10,P$I$EP!P$I$VP
	 JRST	P$IBAD
	TRO	R10,P$I$TE
	JRST	P$ICHE
P$IPON:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	TRNE	R10,P$I$AE!P$I$DE!P$I$SE
	 JRST	P$IBAD
	MOVEI	REG1,1(UTIL)
	CAIL	REG1,(R11)
	 JRST	P$IBAD
	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	MOVEI	REG1,"P"-100
	IDPB	REG1,BPREG
	ADDI	UTIL,2
	TRO	R10,P$I$PW
	JRST	P$ICHR
P$IPOF:	MOVEI	REG1,1(UTIL)
	CAIL	REG1,(R11)
	 JRST	P$IBAD
	MOVEI	REG1,"P"-100
	IDPB	REG1,BPREG
	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	ADDI	UTIL,2
	TRZ	R10,P$I$PW
	TRO	R10,P$I$DE
	JRST	P$ICHR
P$IBAD:	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	P$ICHR
P$IREP:	TSOUT	<CRLF>
	TSOUT	<(FLAG)>
	JUMPE	R12,P$IR04
	HLR	R13,R12
	HRLI	R13,(point 7,)
	TRZ	R10,P$I$PW
P$IR01:	ILDB	IOREG,R13
	JUMPE	IOREG,P$IR03
	CAIN	IOREG,"P"-100
	 JRST	P$IR02
	TRNE	R10,P$I$PW
	 JRST	P$IR01
	TBOUT	<IOREG>
	JRST	P$IR01
P$IR02:	TRC	R10,P$I$PW
	JRST	P$IR01
P$IR03:	TSOUT	<(R12)>
P$IR04:	HRRZI	IOREG,(BPREG)
	HLR	R13,R11
	CAIGE	IOREG,(R13)
	 JRST	P$ICHR
	HRLI	R13,(point 7,)
	TRZ	R10,P$I$PW
P$IR05:	CAMN	R13,BPREG
	 JRST	P$ICHR
	ILDB	IOREG,R13
	CAIN	IOREG,"P"-100
	 JRST	P$IR06
	TRNE	R10,P$I$PW
	 JRST	P$IR05
	TBOUT	<IOREG>
	JRST	P$IR05
P$IR06:	TRC	R10,P$I$PW
	JRST	P$IR05
P$IDEL:	JUMPE	UTIL,P$IBAD
	MOVEI	IOREG,"\"
	TBOUT	<IOREG>
	LDB	IOREG,BPREG
	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	CAIN	IOREG,"P"-100
	 JRST	P$ID01
	LDB	REG1,BPREG
	CAIN	REG1,"P"-100
	 JRST	P$ID02
	TRNE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TBOUT	<IOREG>
	TRZ	R10,P$I$AE!P$I$DE!P$I$SE!P$I$TE
	CAIN	IOREG,"."
	 TRZ	R10,P$I$EP
	CAIN	IOREG,";"
	 TRZ	R10,P$I$VP
	CAIE	IOREG,"<"
	 JRST	P$ID00
	TRZE	R10,P$I$CT
	 JRST	P$ID00
	TRZE	R10,P$I$CA
	 JRST	P$ID00
	TRZ	R10,P$I$CC
P$ID00:	SUBI	UTIL,1
	JUMPE	UTIL,P$ICHR
	LDB	REG1,BPREG
	CAIN	REG1,"<"
	 TRO	R10,P$I$AE
	CAIN	REG1,">"
	 TRO	R10,P$I$DE
	CAIN	REG1,"."
	 TRO	R10,P$I$DE
	CAIN	REG1,";"
	 TRO	R10,P$I$DE
	CAIN	REG1,"*"
	 TRO	R10,P$I$SE
	JRST	P$ICHR
P$ID01:	TRZ	R10,P$I$PW
	LDB	IOREG,BPREG
	JRST	P$ID03
P$ID02:	TROE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TRZ	R10,P$I$DE
P$ID03:	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	TBOUT	<IOREG>
	SUBI	UTIL,2
	JRST	P$ICHR
P$IENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETO	IOREG,
	SETZ	UTIL,
	RETURN
P$IEND:	CAIN	IOREG,12
	 JRST	P$IENL
	CAIN	IOREG,37
	 JRST	P$IENL
	TLNN	FLAG,PATHAS
	 JRST	P$IENV
	JUMPE	UTIL,P$IENV
	LDB	R13,BPREG
	CAIN	R13,">"
	 JRST	P$IENT
	TLNN	FLAG,PATHFR
	 JRST	P$IENV
	TLNE	FLAG,PATHAS
	 JRST	P$IENV
	TRNE	R10,P$I$AE
	 JRST	P$IBAD
	JRST	P$IENV
P$IENL:	TLNN	FLAG,PATHFR
	 JRST	P$IENV
	TRNE	R10,P$I$AE
	 JRST	P$IBAD
P$IENV:	TRNN	R10,P$I$DE
	 JRST	.+3
	TRNN	R10,P$I$EP
	 JRST	P$IBAD
; (((TENEX)))
IFG F.TENX,<
	TLNN	FLAG,PATHFR
	 JRST	P$IE$4
	TLNN	FLAG,PATHLR!PATHRL
	 JRST	P$IE$4
	JUMPN	UTIL,P$IE$4
	CAIG	R12,-1
	 JRST	.+3
	TLNE	FLAG,PATHLR
	 JRST	P$IBAD		; PUT -- SECOND ARGUMENT
	MOVEI	REG1,76
	PBOUT
	TLNE	FLAG,PATHLR
	 HRLZI	REG1,160103	; OLD,MSG,CONFIRM,JFN,SHORT
	TLNE	FLAG,PATHRL
	 HRLZI	REG1,660043	; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
	MOVE	REG2,[100,,101]
	GTJFN
	 JRST	P$IENR
	MOVEM	REG1,LJFN
	HRROI	REG1,LFILE
	MOVE	REG2,LJFN
	SETZ	REG3,
	JFNS
	MOVEI	REG1,100
	BKJFN
	 THUD
	PBIN
	MOVEI	IOREG,(REG1)
	CAILE	R12,-1		; GET SECOND ARGUMENT
	 JRST	P$IE$1
	TLNN	FLAG,PATHLR	; PUT FIRST ARGUMENT
	 JRST	.+5
	CAIN	IOREG,33
	 JRST	P$IE$1
	CAIN	IOREG," "
	 JRST	P$IE$1
	HLRO	REG1,R11
	MOVE	REG2,LJFN
	MOVE	REG3,[002200,,000001]
	JFNS
	LDB	REG2,REG1
	CAIE	REG2,"."
	 JRST	P$IE$1
	SETZ	REG2,
	DPB	REG2,REG1
P$IE$1:	HRROI	REG1,FSBUF
	MOVE	REG2,LJFN
	HRLZI	REG3,002000
	JFNS
	LDB	REG1,[350700,,FSBUF]
	CAIN	REG1,"*"
	 SETOM	FSBUF
	HRROI	REG1,ESBUF
	HRLZI	REG3,000200
	JFNS
	LDB	REG1,[350700,,ESBUF]
	CAIN	REG1,"*"
	 SETOM	ESBUF
	CAIN	REG1,0
	 SETZM	ESBUF
	TLNN	REG2,017000
	 JRST	P$IE$2
	TLNE	REG2,010000
	 SETOM	VSBUF
	TLNE	REG2,007000
	 SETZM	VSBUF
	JRST	P$IE$3
P$IE$2:	HRROI	REG1,UBUF1
	HRLZI	REG3,000020
	JFNS
	HRROI	REG1,UBUF1
	MOVEI	REG3,↑D10
	NIN
	 SETZ	REG2,
	MOVEM	REG2,VSBUF
P$IE$3:	HRRZ	REG1,LJFN
	RLJFN
	 THUD
	MOVEI	UTIL,-1(R11)
	CAIN	IOREG,12
	 SETOM	LJFN
	CAIN	IOREG,37
	 SETOM	LJFN
	RETURN	SKIP,1
P$IE$4:	CAIG	R12,-1
	 JRST	.+3
	TLNE	FLAG,PATHLR
	 JRST	.+3
	SETZM	LFILE
	SETZM	LJFN
>
; (((↑↑↑)))
	JUMPN	UTIL,P$IENN
	TLNN	FLAG,PATHAS
	 JRST	p$ienc
	MOVE	R12,[point 7,[ASCIZ/**/]]
	TLNN	FLAG,PATHFR
	 JRST	P$IENS
	HRRI	R12,[ASCIZ/*.*/]
	TLNE	FLAG,PATHAV
	 HRRI	R12,[ASCIZ/*.*;*/]
	JRST	P$IENS
p$ienc:	tlnn	flag,pathad
	 jrst	p$ibad
	move	r12,[point 7,[asciz/<</]]
	tlne	flag,pathcc
	 hrri	r12,[asciz/</]
	jrst	p$iens
P$IENN:	TLNN	FLAG,PATHAS
	 JRST	P$IENZ
	TRNE	R10,P$I$EP!P$I$VP
	 JRST	P$IENZ
	tlnn	flag,pathfr
	 jrst	.+3
	trnn	r10,p$i$ae!p$i$de
	 jrst	p$ienz
	CAIN	IOREG,12
	 JRST	P$IENZ
	CAIN	IOREG,37
	 JRST	P$IENZ
	LDB	R13,BPREG
	CAIN	R13,"<"
	 JRST	P$IENT
	MOVEI	R13,">"
	IDPB	R13,BPREG
	TBOUT	<R13>
	ADDI	UTIL,1
P$IENT:	MOVE	R12,[point 7,[ASCIZ/**/]]
	TLNN	FLAG,PATHFR
	 JRST	P$IENS
	HRRI	R12,[ASCIZ/*.*/]
	TLNE	FLAG,PATHAV
	 HRRI	R12,[ASCIZ/*.*;*/]
P$IENS:	ILDB	R13,R12
	IDPB	R13,BPREG
	JUMPE	R13,RETN(1)
	TBOUT	<R13>
	AOJA	UTIL,P$IENS
P$IENZ:	SETZ	R13,
	IDPB	R13,BPREG
	ENDR	SKIP,1

; P$PP -- PROCESS PATH (NODES AND FILES)
;   IN: IOREG -- SOURCE,,NODE DESTINATION
;	UTIL -- FILE DESTINATION,,EXTENSION DESTINATION
;	FLAG -- PATH CONTEXT FLAGS
;   OUT: FLAG -- FOUND FLAGS
;	 UTIL -- VERSION NUMBER (-1 *) (0 NONE)
;
P$PP:	BEGINR	<BPREG>
	TLNE	FLAG,PATHNR
	 JRST	P$PN
	HLR	BPREG,IOREG
	HRLI	BPREG,(point 7,)
	TLNN	FLAG,PATHNP
	 JRST	P$PF0
	SETZM	(IOREG)
	MOVE	REG1,BPREG
	MOVE	REG2,BPREG
P$PS1:	ILDB	REG3,BPREG
	CAIN	REG3,"<"
	 JRST	P$PS2
	CAIN	REG3,">"
	 JRST	P$PS2
	CAIN	REG3,"."
	 JRST	P$PS3
	CAIN	REG3,";"
	 JRST	P$PS3
	JUMPE	REG3,P$PS3
	JRST	P$PS1
P$PS2:	MOVE	REG2,BPREG
	JRST	P$PS1
P$PS3:	MOVE	BPREG,REG2
	CAMN	BPREG,REG1
	 JRST	P$PF
	TLO	FLAG,PATHNF
	MOVE	REG1,BPREG
	LDB	REG2,REG1
	CAIN	REG2,"<"
	 ILDB	REG2,REG1
	SETZ	REG3,
	DPB	REG3,REG1
	PUSH	STAK,REG1
	PUSH	STAK,REG2
	CALLR	P$CP
	POP	STAK,REG2
	POP	STAK,REG1
	DPB	REG2,REG1
	JRST	P$PF
P$PN:	TLO	FLAG,PATHNF
	CALLR	P$CP
	RETURN
P$PF:	SKIPE	(IOREG)
	 JRST	P$PF0
	MOVE	REG1,[point 7,CONTEX]
	MOVE	REG2,[point 7,NBUF]
	SCOPY	(REG1,REG2)
P$PF0:	TLO	FLAG,PATHFF
	SETZM	(UTIL)
	HLR	REG1,UTIL
	HRLI	REG1,(point 7,)
P$PF1:	ILDB	REG2,BPREG
	IDPB	REG2,REG1
	JUMPE	REG2,P$PF3
	CAIN	REG2,";"
	 JRST	P$PF4
	CAIE	REG2,"."
	 JRST	P$PF1
	SETZ	REG2,
	DPB	REG2,REG1
	HRRI	REG1,(UTIL)
	HRLI	REG1,(point 7,)
P$PF2:	ILDB	REG2,BPREG
	IDPB	REG2,REG1
	CAIN	REG2,";"
	 JRST	P$PF4
	JUMPN	REG2,P$PF2
P$PF3:	SETZ	UTIL,
	RETURN
P$PF4:	SETZ	REG2,
	DPB	REG2,REG1
	ILDB	REG2,BPREG
	CAIE	REG2,"*"
	 JRST	P$PF5
	SETO	UTIL,
	RETURN
P$PF5:	SETZ	UTIL,
P$PF6:	SUBI	REG2,"0"
	IMULI	UTIL,↑D10
	ADDI	UTIL,(REG2)
	ILDB	REG2,BPREG
	JUMPN	REG2,P$PF6
	ENDR

; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
;   IN: IOREG -- SOURCE,,DESTINATION
; 	FLAG -- PATH CONTEXT FLAGS
;
P$CP:	BEGINR	<IOREG,FLAG>
	MOVEI	REG1,<<LBSIZE*5>-1>
	HLR	REG2,IOREG
	HRLI	REG2,350700
	HRRI	REG3,(IOREG)
	HRLI	REG3,(point 7,)
	LDB	IOREG,REG2
	CAIN	IOREG,"<"
	 JRST	P$CPCX
	TLNE	FLAG,PATHCT
	 JRST	P$CPCT
	TLNE	FLAG,PATHCA
	 JRST	P$CPCA
	JRST	P$CPCC
P$CPCX:	ILDB	IOREG,REG2
	CAIE	IOREG,"<"
	 JRST	P$CPCC
	ILDB	IOREG,REG2
	CAIE	IOREG,"<"
	 JRST	P$CPCA
	ILDB	IOREG,REG2
P$CPCT:	MOVE	REG4,[point 7,[ASCIZ/%TOP./]]
	SCOPY	(REG4,REG3)
	MOVE	REG4,[point 7,ANCHOR]
	SCOPY	(REG4,REG3)
	SUBI	REG1,11
	JRST	P$CPCE
P$CPCA:	MOVE	REG4,[point 7,[ASCIZ/%LOGIN/]]
	SCOPY	(REG4,REG3)
	SUBI	REG1,6
	JRST	P$CPCE
P$CPCC:	MOVE	REG4,[point 7,CONTEX]
	ILDB	0,REG4
	JUMPE	0,.+4
	SOJL	REG1,P$CPE
	IDPB	0,REG3
	JRST	.-4
	MOVE	REG4,REG3
	IDPB	0,REG4
P$CPCE:	JUMPE	IOREG,P$CPZ0
	MOVEI	REG4,"."
	IDPB	REG4,REG3
	SUBI	REG1,1
	MOVEI	REG4,42
	SETZ	FLAG,
	JRST	P$CPI0
P$CPI:	ILDB	IOREG,REG2
P$CPI0:	CAIN	IOREG,"P"-100
	 JRST	P$CPI
	CAIN	IOREG,">"
	 JRST	P$CPS
	JUMPE	IOREG,P$CPZ
	JUMPN	FLAG,P$CPO
	CAIN	IOREG,":"
	 JRST	P$CPP
	CAIN	IOREG,"*"
	 JRST	P$CPO
	CAIGE	IOREG,"A"
	 JRST	P$CPQ
	CAILE	IOREG,"Z"
	 JRST	P$CPQ
P$CPO:	SOJL	REG1,P$CPE
	IDPB	IOREG,REG3
	JRST	P$CPI
P$CPQ:	SOJL	REG1,P$CPE
	IDPB	REG4,REG3
	JRST	P$CPO
P$CPS:	JUMPE	FLAG,.+6
	MOVEI	IOREG,"'"
	IDPB	IOREG,REG3
	MOVEI	IOREG,")"
	IDPB	IOREG,R3
	SETZ	FLAG,
	MOVEI	IOREG,"."
	JRST	P$CPO
P$CPP:	SUBI	REG1,4
	JUMPL	REG1,P$CPE
	MOVEI	IOREG,"("
	IDPB	IOREG,R3
	MOVEI	IOREG,"'"
	IDPB	IOREG,R3
	SETO	FLAG,
	JRST	P$CPI
P$CPE:	TSOUT	<[ASCIZ/ (Pathname too long.)/],CRLF>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	JRST	CMDCMD
P$CPZ:	JUMPE	FLAG,.+5
	MOVEI	REG1,"'"
	IDPB	REG1,REG3
	MOVEI	REG1,")"
	IDPB	REG1,REG3
P$CPZ0:	IDPB	IOREG,REG3
	ENDR

; LOCAL FILE NAME PREPARATION
;   IN: IOREG -- FILE LOCATION,,EXTENSION LOCATION
;
P$LF:	BEGINR	<IOREG>
; (((TENEX)))
IFG F.TENX,<
	SKIPE	LFILE
	 RETURN
>
; (((↑↑↑)))
	HLL	REG1,IOREG
	HRRI	REG1,FSBUF
	BLT	REG1,<FSBUF+SBSIZE-1>
	LDB	REG1,[350700,,FSBUF]
	CAIN	REG1,"*"
	 SETOM	FSBUF
	HRLI	REG1,(IOREG)
	HRRI	REG1,ESBUF
	BLT	REG1,<ESBUF+SBSIZE-1>
	LDB	REG1,[350700,,ESBUF]
	CAIN	REG1,"*"
	 SETOM	ESBUF
	CAIN	REG1,0
	 SETZM	ESBUF
	HLR	REG1,IOREG
	HRLI	REG1,(point 7,)
	MOVE	REG2,[point 7,ABUF]
	ILDB	REG3,REG1
	IDPB	REG3,REG2
	JUMPN	REG3,.-2
	SKIPN	(IOREG)
	 JRST	.+8
	MOVEI	REG3,"."
	DPB	REG3,REG2
	HRRI	REG1,(IOREG)
	HRLI	REG1,(point 7,)
	ILDB	REG3,REG1
	IDPB	REG3,REG2
	JUMPN	REG3,.-2
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	HRRZI	IOREG,ABUF
	CALLR	LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	MOVEM	UTIL,VSBUF
	JUMPE	UTIL,P$LFX1
	MOVEI	REG3,";"
	DPB	REG3,REG2
	JUMPG	UTIL,P$LFX0
	MOVEI	REG3,"*"
	IDPB	REG3,REG2
	SETZ	REG3,
	IDPB	REG3,REG2
	JRST	P$LFX1
P$LFX0:	MOVE	REG1,REG2
	MOVE	REG2,UTIL
	MOVEI	REG3,↑D10
	NOUT
	 THUD
P$LFX1:	MOVE	IOREG,[ABUF,,LFILE]
	BLT	IOREG,<LFILE+SBSIZE-1>
>
; (((↑↑↑)))
	ENDR


; ***DATACOMPUTER INTERFACE ROUTINES***

; DALO -- ALLOCATE SPACE
;
DALO:	BEGINR
	DCSOUT	<[ASCIZ/MODIFY /],NBUF,<[ASCIZ/,M=/]>>
	MOVE	IOREG,ABUF
	DCNOUT	<IOREG>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DATT -- LOGIN TO NODE
;
DATT:	BEGINR
	DCSOUT	<[ASCIZ/LOGIN /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	REG1,[ASCII/%LOGI/]
	MOVEM	REG1,CONTEX
	MOVE	REG1,[ASCII/N/]
	MOVEM	REG1,<CONTEX+1>
	SKIPN	OPENED
	 RETURN
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA:	BEGINR	<IOREG,UTIL>
	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIV/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCHAD:	DCSOUT	<[ASCIZ/DELETEP /],NBUF,<[ASCIZ/,N=1/]>,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	DCHAD
	TSOUT	<[ASCIZ/ [OK]/],CRLF>
DCHAI:	TAIN	<[ASCIZ/ Add a new privilege? /]>
	 RETURN
	 RETURN
	SETZM	ABUF		; WRITE FLAG
	SETZM	<ABUF+1>	; HOST
	SETzM	<ABUF+2>	; SOCKET
	SETOM	<ABUF+3>	; PASSWORD
	TAIN	<[ASCIZ/  Allow control? /]>
	 JRST	DCHAI
	 SETOM	ABUF
	TAIN	<[ASCIZ/  Restrict via network? /]>
	 JRST	DCHAI
	 JRST	DCHAI5
	tain	<[asciz/   restrict via local host? /]>
	 jrst	dchai
	 jrst	dchai1
	move	ioreg,lhost
	jrst	dchai2
dchai1:	tsout	<[asciz/    host number (octal): /]>
	TNIN	([ASCIZ/    Host number (octal): /],10)
	 JRST	DCHAI
	TSOUT	<CRLF>
DCHAI2:	MOVEM	IOREG,<ABUF+1>
	TAIN	<[ASCIZ/   RESTRICT VIA USER? /]>
	 JRST	DCHAI
	 JRST	DCHAI5
	MOVE	IOREG,LHOST
	CAMN	IOREG,<ABUF+1>
	 JRST	DCHAI3
	TSOUT	<[ASCIZ/    SOCKET NUMBER (OCTAL): /]>
	TNIN	([ASCIZ/    SOCKET NUMBER (OCTAL): /],10)
	 JRST	DCHAI
	JRST	DCHAI4
dchai3:
; (((NOT ITS)))
IFGE F.TENX,<
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)
IFE F.SAIL,<
	TSOUT	<[ASCIZ/    User: /]>
	TNIN	([ASCIZ/    User: /],10)
	 JRST	DCHAI
	LSH	IOREG,11
	ADDI	IOREG,100
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	TSOUT	<[ASCIZ/    User: /]>
	TSIN	(UBUF1,LBSIZE,[ASCIZ/    User: /])
	 JRST	DCHAI
	SETZ	REG1,
	MOVE	REG2,[point 7,UBUF1]
	STDIR
	 JRST	.+3
	 JRST	.+2
	JRST	.+4
	HRROI	REG1,[ASCIZ/ (User not found.)
/]
	PSOUT
	JRST	DCHAI
	HRRZI	IOREG,(REG1)
	LSH	IOREG,↑D15
	ADDI	IOREG,20
>
; (((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<SETZM ABUF+2
	JRST DCHAI5>
IFN F.SAIL,<SETZM <ABUF+2>
	JRST DCHAI5>
dchai4:	MOVEM	IOREG,<ABUF+2>
	TSOUT	<CRLF>
dchai5:	TAIN	<[ASCIZ/  Restrict via password? /]>
	 JRST	DCHAI
	 JRST	DCHAC
	TSOUT	<[ASCIZ/   Password: /]>
	TSIN	(<ABUF+3>,<SBSIZE-3>,[ASCIZ/   Password: /])
	 JRST	DCHAI
	TSOUT	<CRLF>
DCHAC:	DCSOUT	<[ASCIZ/CREATEP /],NBUF,<[ASCIZ/,U=**,G=LR/]>>
	SKIPE	ABUF
	 JRST	DCHAC1
	DCSOUT	<[ASCIZ/CWA/]>
DCHAC1:	SKIPN	<ABUF+1>
	 JRST	DCHAC3
	DCSOUT	<<[ASCIZ/,H=/]>>
	MOVE	IOREG,<ABUF+1>
	DCNOUT	<IOREG>
	DCSOUT	<<[ASCIZ/,S=/]>>
	MOVE	IOREG,<ABUF+2>
	JUMPE	IOREG,DCHAC2
	DCNOUT	<IOREG>
	JRST	DCHAC3
DCHAC2:	DCSOUT	<[ASCIZ/ANY/]>
DCHAC3:	SETO	IOREG,
	CAMN	IOREG,<ABUF+3>
	 JRST	DCHAC4
	DCSOUT	<<[ASCIZ/,P='/]>,<ABUF+3>,[ASCIZ/'/]>
DCHAC4:	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	TSOUT	<[ASCIZ/  [OK]/],CRLF>
	JRST	DCHAI
	ENDR

; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON:	BEGINR
	DCSOUT	<[ASCIZ/LIST /],NBUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DCON1
	TSOUT	<[ASCIZ/ [Old Node]/],CRLF>
	JRST	DCON2
	RETURN
DCON1:	TAIN	<[ASCIZ/ [New Node][Confirm]/]>
	 RETURN
	 RETURN
	DCSOUT	<[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCON2:	MOVE	REG1,[point 7,NBUF]
	MOVE	REG2,[point 7,CONTEX]
	SCOPY	(REG1,REG2)
	ENDR

; DCRE -- CREATE NEW NODE
;
DCRE:	BEGINR
	DCSOUT	<[ASCIZ/CREATE /],NBUF,<[ASCIZ/,M=/]>>
	MOVEI	IOREG,DEFALO
	DCNOUT	<IOREG>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	CALLR	DCHA
	ENDR

; DDEL -- DELETE FILES
;
DDEL:	BEGINR	<IOREG>
	SETZ	IOREG,
	CALLR	D$OPEN
	 RETURN
	SETO	IOREG,
	CALLR	D$VER
	 RETURN
	DCSOUT	<[ASCIZ/BEGIN
	DECLARE DELETED INTEGER
	DELETED=0
	UPDATE FILES IN "<FILES">/]>
	HRRZI	IOREG,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<DDELS>
	SETOM	FLAGDE
	CALLR	RENDEM
	 RETURN
	CALLR	RENDER
	 RETURN
	ENDR
DDELS:	ASCIZ/
	BEGIN
		STATUS='D'
		DELETED=DELETED+1
		COMMENT FILES.FILE.HEADER.FILENAME
		  ! '.' ! FILES.FILE.HEADER.EXTENSION
		    ! ';' ! FILES.FILE.HEADER.VERSION
	END
	IF DELETED EQ 0 THEN ERROR 'NO SUCH FILE'
END;
/

; DDIR -- FILE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR:	BEGINR	<IOREG,UTIL>
; (((TENEX)))
IFG F.TENX,<
	SETZM	FLAGCO
>
; (((↑↑↑)))
	SETO	IOREG,
	CALLR	D$OPEN
	 RETURN
	SKIPN	VBUF
	 SETOM	VBUF
	SETZ	UTIL,
	CAIN	FLAG,DD$T
	 JRST	DDIRO1
	CAIN	FLAG,DD$V
	 JRST	DDIRO2
	RETURN
DDIRO1:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IOREG,[ASCIZ/ STATUS EQ ' '/]
	JRST	DDIRO3
DDIRO2:	DCSOUT	<[ASCIZ/"<VERBOSE">="<FILES">/]>
	SETZ	IOREG,
DDIRO3:	CALLR	D$WITH
	DCSOUT	<SEMI>
	MOVE	IOREG,[ASCII/.I241/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DDIRF:	CALLR	RENPRE
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DDIRF:	SKIPN	FLAGCO
	 JRST	DDIRF0
	HRROI	REG1,[ASCIZ/ [Aborting]
/]
	PSOUT
	MOVE	REG1,DCOJFN
	MOVEI	REG2,22
	MTOPR
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DDIRF0:	CALLR	RENPRE
>
; (((↑↑↑)))
	CAMN	IOREG,[ASCII/     /]
	 JRST	DDIRF1
	CAMN	IOREG,[ASCII/.I261/]
	 JRST	DDIRF2
	CALLR	RENLIP
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DDIRF1:	CALLR	<(FLAG)>
	AOJA	UTIL,DDIRF
DDIRF2:	CALLR	RENLIN
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	UTIL,RETN(0)
	TSOUT	<[ASCIZ/ [No Files]/],CRLF>
	ENDR

; DD$T -- TERSE FILES
;
DD$T:	BEGINR	<IOREG>
	SKIPE	FLAGDD
	 JRST	DD$T1
	MOVEI	IOREG,11
	TBOUT	<IOREG>
DD$T1:	DCBIN	<IOREG>
	SKIPE	FLAGDD
	 JRST	DD$T2
	TBOUT	<IOREG>
DD$T2:	CAIE	IOREG,12
	 JRST	DD$T1
	ENDR

; DD$V -- VERBOSE FILES
;
DD$V:	BEGINR	<IOREG>
	SKIPE	FLAGDD
	 JRST	DD$V1
	MOVEI	IOREG,11
	TBOUT	<IOREG>
DD$V1:	DCBIN	<IOREG>
	SKIPE	FLAGDD
	 JRST	DD$V3
	CAIN	IOREG,11
	 JRST	DD$V2
	TBOUT	<IOREG>
	JRST	DD$V3
DD$V2:	TSOUT	<CRLF>
	TBOUT	<IOREG>
	TBOUT	<IOREG>
	JRST	DD$V1
DD$V3:	CAIE	IOREG,12
	 JRST	DD$V1
	ENDR

; DEXP -- EXPUNGE
;
DEXP:	BEGINR	<IOREG>
	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES"> %INFORMATION/],SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	CAmn	IOREG,[ASCII/.I280/]
	 jrst	dexp1
	tsout	<[asciz/ (there are no <FILES>.)/],CRLF>
	JRST	DEXP3
	 JRST	DEXP3
DEXP1:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	DEXP2
	DCBIN	<IOREG>
	CAIN	IOREG," "
	 JRST	DEXP2
	CALLR	RENLIN
	JRST	DEXP3
DEXP2:	CAIE	IOREG," "
	 JRST	DEXP1
	DCBIN	<IOREG>
	CAIE	IOREG,"R"
	 JRST	DEXP1
	DCBIN	<IOREG>
	CAIE	IOREG,"E"
	 JRST	DEXP1
	DCBIN	<IOREG>
	CAIE	IOREG,"C"
	 JRST	DEXP1
	DCBIN	<IOREG>
	CAIE	IOREG,"S"
	 JRST	DEXP1
	DCBIN	<IOREG>
	CAIE	IOREG,"="
	 JRST	DEXP1
	CALLR	DCNIN
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	JUMPN	IOREG,DEXP4
	DCSOUT	<[ASCIZ/DELETE /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SKIPN	OPENED
	 RETURN
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
DEXP3:	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DEXP4:	SETZ	IOREG,
	CALLR	D$OPEN
	 RETURN
	DCSOUT	<[ASCIZ/OPEN /],NBUF,<[ASCIZ/."<FILES">,SYN="<">/]>,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/"<FILES">="<"> WITH STATUS EQ ' '/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ/CLOSE "<">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SETZM	OPENED
	ENDR

; DGET -- GET-RETRIEVE
;
DGET:	BEGINR	<IOREG,FLAG>
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAME	REG2,LDIR
	 CALLR	D$CON
>
; (((↑↑↑)))
	SETZ	FLAG,
	SETO	IOREG,
	CALLR	D$OPEN
	 RETURN
	SKIPLE	VBUF
	 JRST	DGET1
	MOVEI	IOREG," "
	CALLR	D$VER
	 RETURN
	JRST	DGET2
DGET1:	DCSOUT	<[ASCIZ/BEGIN
	DECLARE EXTANT INT
	EXTANT=0
	FOR "<FILES">
	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
	      AND (VERSION EQ /]>
	MOVE	IOREG,VBUF
	DCNOUT	<IOREG>
	DCSOUT	<[ASCIZ/)
		AND (STATUS EQ ' ')
			EXTANT=EXTANT+1
	IF EXTANT NE 1 THEN ERROR 'NO SUCH FILE'
END/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDEM
	 RETURN
	CALLR	RENDER
	 RETURN
DGET2:	DCSOUT	<[ASCIZ/"<GET">="<FILES">/]>
	HRRZI	IOREG,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<SEMI>
	CALLR	NETOI
	 THUD
	MOVE	IOREG,[ASCII/;I249/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	TSOUT	<[ASCIZ/ [OK]/],CRLF>
	SETZM	NSUM
DGET3:	CALLR	GETFIL
	 JRST	DGET4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	CALLR	LOCNFO
	CALLR	LOCOO
	 THUD
	CALLR	GETDAT
	CALLR	LOCC
	SKIPE	FLAGTT
	 CALLR	NETRAT
	AOJA	FLAG,DGET3
DGET4:	CALLR	NETC
	MOVE	IOREG,[ASCII/;I269/]
	CALLR	RENFIP
	 JRST	DGETE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	FLAG,RETN(1)
	TSOUT	<[ASCIZ/ (No Such File)/],CRLF>
	RETURN	SKIP,1
DGETE:	CALLR	D$CON
	ENDR
; FIELD LENGTHS IN WORDS FROM <GET>
	GET$F==SBSIZE		; FILENAME
	GET$E==SBSIZE		; EXTENSION
	GET$D==4		; DATE

; DLIN -- DATACOMPUTER LINK
;
DLIN:	BEGINR	<IOREG,UTIL,FLAG>
	MOVE	FLAG,FLAGDD
DLINI:	TSOUT	(<[BYTE (7)76,0,0,0,0]>)
	TSIN	(ABUF,SBSIZE,<[BYTE (7)76,0,0,0,0]>)
	 JRST	DLINI
	JUMPE	UTIL,DLINE
	TSOUT	<CRLF>
	SETZM	FLAGDD
	DCSOUT	<ABUF,CRLF>
	SETOM	FLAGDD
	CALLR	RENDER
	 JRST	DLINI
	JRST	DLINI
DLINE:	TSOUT	<[ASCIZ/[Returning]/],CRLF>
	MOVEM	FLAG,FLAGDD
	ENDR

; DLIS -- NODE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DLIS:	BEGINR	<IOREG,UTIL>
; (((TENEX)))
IFG F.TENX,<
	SETZM	FLAGCO
>
; (((↑↑↑)))
	CAIN	FLAG,DL$T
	 JRST	DLISO1
	CAIN	FLAG,DL$V
	 JRST	DLISO2
	CAIN	FLAG,DL$P
	 JRST	DLISO3
	RETURN
DLISO1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %NAME/],SEMI>
	JRST	DLISI
DLISO2:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %INFORMATION/],SEMI>
	JRST	DLISI
DLISO3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIVILEGE/],SEMI>
DLISI:	SETZ	UTIL,
	SETZM	GBUF1
	MOVE	REG1,[GBUF1,,GBUF1+1]
	BLT	REG1,<GBUF1+LBSIZE-1>
	MOVEI	REG1,<GBUF2+1>
	MOVEM	REG1,GBUF2
	CALLR	RENPRE
	CAMN	IOREG,[ASCII/.I280/]
	 JRST	DLISD
	CALLR	RENLIP
	JRST	DLISER
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DLISN:	DCBIN	<IOREG>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DLISN:	SKIPN	FLAGCO
	 JRST	DLISN0
	HRROI	REG1,[ASCIZ/ [Aborting]
/]
	PSOUT
	MOVE	REG1,DCOJFN
	MOVEI	REG2,22
	MTOPR
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<SEMI>
	JRST	DLISER
DLISN0:	DCBIN	<IOREG>
>
; (((↑↑↑)))
	CAIE	IOREG," "
	 JRST	DLISE
	SETO	UTIL,
	SKIPE	FLAGDD
	 JRST	DLISD
	CALLR	<(FLAG)>
	JRST	DLISN
DLISD:	CALLR	RENLIN
	JRST	DLISN
DLISE:	CAIN	IOREG,"?"
	 JRST	DEATH
	CALLR	RENLIN
	JUMPN	UTIL,DLISER
	TSOUT	<[ASCIZ/ [No Nodes]/],CRLF>
DLISER:	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DL$T -- TERSE NODES
;
DL$T:	BEGINR
	CALLR	DL$NAM
	 JRST	DL$T0
	TSOUT	<CRLF>
DL$T0:	CALLR	RENLIN
	ENDR

; DL$V -- VERBOSE NODES
;
DL$V:	BEGINR	<IOREG,UTIL,FLAG>
DL$VN:	DCBIN	<IOREG>
	CAIE	IOREG,"="
	 JRST	DL$VN
	CALLR	DL$NAM
	 JRST	DL$VE
	TSOUT	<CRLF>
	MOVEI	UTIL,GBUF1
	SKIPE	(UTIL)
	 AOJA	UTIL,.-1
	SUBI	UTIL,GBUF1
DL$VF:	DCBIN	<IOREG>
	CAIE	IOREG,"="
	 JRST	DL$VF
	DCBIN	<IOREG>
	SETZ	FLAG,
	CAIN	IOREG,"F"
	 MOVEI	FLAG,6
	CAIN	IOREG,"P"
	 MOVEI	FLAG,1
	CAIN	IOREG,"N"
	 MOVEI	FLAG,3
	JUMPE	FLAG,DL$VE
	CALLR	RENLIN
DL$VD:	MOVEI	IOREG,(UTIL)
DL$VD0:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IOREG,DL$VD0
	MOVEI	IOREG,"]"
	TBOUT	<IOREG>
DL$VD1:	DCBIN	<IOREG>
	TBOUT	<IOREG>
	CAIE	IOREG,12
	 JRST	DL$VD1
	SOJG	FLAG,DL$VD
	RETURN
DL$VE:	CALLR	RENLIN
	ENDR

; DL$P -- PROTECTION
;
DL$P:	BEGINR	<IOREG>
	CALLR	DL$NAM
	 JRST	DL$P1
	TSOUT	<CRLF>
	CALLR	RENLIN
	RETURN
DL$P1:	MOVEI	IOREG,GBUF1
DL$P2:	SKIPE	(IOREG)
	 AOJA	IOREG,DL$P2
	SUBI	IOREG,GBUF1
DL$P3:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IOREG,DL$P3
	MOVEI	IOREG,"]"
	TBOUT	<IOREG>
DL$P4:	DCBIN	<IOREG>
	TBOUT	<IOREG>
	CAIE	IOREG,12
	 JRST	DL$P4
	ENDR

; DL$NAM -- DIRECTORY: NAME OUTPUT
;   OUT: IOREG -- LAST CHARACTER INPUT
;
DL$NAM:	BEGINR	<BPREG,UTIL,FLAG,R10>
	SETZ	R10,
	SETZ	FLAG,
	MOVE	BPREG,[point 7,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
	DCBIN	<IOREG>
	CAILE	IOREG," "
	 JRST	DL$NA1
	RETURN
DL$NAN:	DCBIN	<IOREG>
DL$NA1:	CAIN	IOREG,"."
	 JRST	DL$NIN
	CAIG	IOREG," "
	 JRST	DL$NA3
	CAIE	IOREG,42
	 JRST	DL$NA2
	DCBIN	<IOREG>
DL$NA2:	IDPB	IOREG,BPREG
	SOJG	UTIL,DL$NAN
	JRST	DL$NER
DL$NA3:	SETZ	REG1,
	IDPB	REG1,BPREG
	TSOUT	<[ASCIZ/  /],ABUF>
	RETURN	SKIP,1
DL$NIN:	MOVE	BPREG,[point 7,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
DL$NI1:	DCBIN	<IOREG>
	CAIN	IOREG,"."
	 JRST	DL$NCN
	CAIG	IOREG," "
	 JRST	DL$NCN
DL$NI2:	CAIE	IOREG,42
	 JRST	DL$NI3
	DCBIN	<IOREG>
DL$NI3:	IDPB	IOREG,BPREG
	SOJG	UTIL,DL$NI1
	JRST	DL$NER
DL$NCN:	SETZ	REG1,
	IDPB	REG1,BPREG
	SKIPN	REG2,GBUF1(FLAG)
	 JRST	DL$NON
	HRLI	REG2,(point 7,)
	MOVE	REG1,[point 7,ABUF]
DL$NC1:	ILDB	REG3,REG1
	ILDB	REG4,REG2
	CAIE	REG3,(REG4)
	 JRST	DL$NON
	JUMPN	REG3,DL$NC1
	CAIG	IOREG," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NON:	CAIL	FLAG,LBSIZE-2
	 JRST	DL$NER
	SETZM	GBUF1+1(FLAG)
	HRL	REG1,GBUF1+1(FLAG)
	HRR	REG1,GBUF1+2(FLAG)
	BLT	REG1,<GBUF1+LBSIZE-1>
	MOVE	REG1,[point 7,ABUF]
	SKIPN	REG2,GBUF1(FLAG)
	 HRR	REG2,GBUF2
	HRLI	REG2,(point 7,)
	HRRZI	BPREG,(BPREG)
	SUBI	BPREG,<ABUF-1>
	ADDI	BPREG,(REG2)
	CAIL	BPREG,<GBUF2+LBSIZE>
	 JRST	DL$NER
	HRRZM	REG2,GBUF1(FLAG)
DL$NO1:	ILDB	REG3,REG1
	IDPB	REG3,REG2
	JUMPN	REG3,DL$NO1
	HRRZI	REG2,1(REG2)
	MOVEM	REG2,GBUF2
	MOVEI	UTIL,(FLAG)
	JUMPE	R10,DL$NO2
	TSOUT	<CRLF>
DL$NO2:	TSOUT	<[ASCIZ/    /]>
	SOJGE	UTIL,DL$NO2
	TSOUT	<ABUF>
	SETO	R10,
	CAIG	IOREG," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NER:	TSOUT	<[ASCIZ/ (Pathname too long.)/],CRLF>
	ENDR

; DPUT -- PUT-STORE
;
DPUT:	BEGINR	<IOREG>
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAME	REG2,LDIR
	 CALLR	D$CON
>
; (((↑↑↑)))
	CALLR	LOCFFI
	 RETURN
	SKIPN	OPENED
	 JRST	DPUT3
	MOVE	REG1,[440700,,OPENED]
	MOVE	REG2,[440700,,NBUF]
DPUT1:	ILDB	REG3,REG1
	ILDB	REG4,REG2
	CAIE	REG3,(REG4)
	 JRST	DPUT2
	JUMPN	REG3,DPUT1
	MOVEI	REG1,1
	CAMN	REG1,OPENEM
	 JRST	DPUT5
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	REG1,1
	MOVEM	REG1,OPENEM
	JRST	DPUT5
DPUT2:	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DPUT3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DPUT4
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	REG1,[440700,,NBUF]
	MOVE	REG2,[440700,,OPENED]
	SCOPY	(REG1,REG2)
	MOVEI	REG1,1
	MOVEM	REG1,OPENEM
	JRST	DPUT5
DPUT4:	DCSOUT	<[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	TSOUT	<[ASCIZ/ [New <FILES>]/],CRLF>
	MOVE	REG1,[440700,,NBUF]
	MOVE	REG2,[440700,,OPENED]
	SCOPY	(REG1,REG2)
	SETZM	OPENEM
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	REG1,1
	MOVEM	REG1,OPENEM
	SETZM	VBUF
	JRST	DPUT6
DPUT5:	SETZM	VBUF
	SETZ	IOREG,
	CALLR	D$VER
	 RETURN
DPUT6:	AOS	VBUF
	DCSOUT	<[ASCIZ/"<FILES">="<PUT">/],SEMI>
	CALLR	NETOO
	 THUD
	MOVE	IOREG,[ASCII/;I239/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	TSOUT	<[ASCIZ/ [OK]/],CRLF>
	SETZM	NSUM
	CALLR	LOCOI
	 THUD
	CALLR	NETFFI
DPUT7:	CALLR	PUTFIL
	CALLR	PUTDAT
	SKIPE	FLAGTT
	 CALLR	NETRAT
	CALLR	LOCNFI
	 JRST	DPUT7
	CALLR	NETC
	MOVE	IOREG,[ASCII/;I259/]
	CALLR	RENFIP
	 JRST	DPUTE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN	SKIP,1
DPUTE:	CALLR	D$CON
	ENDR

; DREM -- DELETE NODES
;
DREM:	BEGINR
	DCSOUT	<[ASCIZ/DELETE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SETZM	OPENED
	DCSOUT	<[ASCIZ/LIST /],CONTEX,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	RETURN
	TSOUT	<[ASCIZ/ [Connected To Attached Node]/],CRLF>
	MOVE	REG1,[ASCII/%LOGI/]
	MOVEM	REG1,CONTEX
	MOVE	REG1,[ASCII/N/]
	MOVEM	REG1,<CONTEX+1>
	ENDR

; DUND -- UNDELETE
;
DUND:	BEGINR	<IOREG>
	SETZ	IOREG,
	CALLR	D$OPEN
	 RETURN
	movei	IOREG,"d"
	CALLR	D$VER
	 RETURN
	DCSOUT	<[ASCIZ/BEGIN
	DECLARE UNDELETED INTEGER
	UNDELETED=0
	UPDATE FILES IN "<FILES">/]>
	HRRZI	IOREG,[ASCIZ/ STATUS EQ 'D'/]
	CALLR	D$WITH
	DCSOUT	<DUNDS>
	SETOM	FLAGDE
	CALLR	RENDEM
	 RETURN
	CALLR	RENDER
	 RETURN
	ENDR
DUNDS:	ASCIZ/
	BEGIN
		STATUS=' '
		UNDELETED=UNDELETED+1
		COMMENT FILES.FILE.HEADER.FILENAME
		  ! '.' ! FILES.FILE.HEADER.EXTENSION
		    ! ';' ! FILES.FILE.HEADER.VERSION
	END
	IF UNDELETED EQ 0 THEN ERROR 'NO SUCH FILE'
END;
/

; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT:	BEGINR	<IOREG,BPREG,UTIL,FLAG>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	D$IN0
	TSOUT	<[ASCIZ/ ?? DATACOMPUTER INITIALIZATION FAILURE ??/],CRLF>
	JRST	QUIT
D$IN0:	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
	HRRZI	UTIL,HOSTS
D$IN1:	SKIPN	(UTIL)
	 JRST	D$IND
	HLRZ	REG1,(UTIL)
	CAME	REG1,LHOST
	 AOJA	UTIL,D$IN1
	MOVE	IOREG,[point 7,[ASCIZ/%TOP.DFTP./]]
	MOVE	BPREG,[point 7,ABUF]
	SCOPY	(IOREG,BPREG)
	HRR	IOREG,(UTIL)
	HRLI	IOREG,(point 7,)
	SCOPY	(IOREG,BPREG)
	MOVEI	IOREG,"."
	IDPB	IOREG,BPREG
; (((ITS)))
IFL F.TENX,<
	.SUSET [.RXUNAME,,UBUF1]
	SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)))
IFE F.SAIL,<
	MOVE	REG1,[-1,,31]
	MOVE	REG2,[-1,,32]
	GETTAB	REG1,
	 THUD
	GETTAB	REG2,
	 THUD
	MOVEM	REG1,UBUF1
	MOVEM	REG2,<UBUF1+1>
	SETZM	<UBUF1+2>
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
	GETPPN REG1,
	 JFCL
	TRNN REG1,770000
	 JRST [	LSH REG1,↑D6
		JRST .-1]		; Left Justify SAIL PN's
	HRLZM REG1,UBUF1
	SETZM UBUF1+1
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((ITS+TOPS-10)
IFLE F.TENX,<
	MOVE	REG1,[point 6,UBUF1]
	MOVEI	REG2,42
	ILDB	REG3,REG1
	JUMPE	REG3,.+7
	ADDI	REG3,40
	CAIL	REG3,"A"
	 CAILE	REG3,"Z"
	  IDPB	REG2,BPREG
	IDPB	REG3,BPREG
	JRST	.-7
	MOVE	REG1,BPREG
	IDPB	REG3,REG1
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAMN	REG1,REG2
	 JRST	.+10
	HRROI	REG1,[ASCIZ/  (from /]
	PSOUT
	MOVEI	REG1,101
	DIRST
	 THUD
	HRROI	REG1,[ASCIZ/)
/]
	PSOUT
	HRROI	REG1,UBUF1
	DIRST
	 THUD
	MOVE	REG1,[point 7,UBUF1]
	MOVEI	REG2,42
	ILDB	REG3,REG1
	JUMPE	REG3,.+6
	CAIL	REG3,"A"
	 CAILE	REG3,"Z"
	  IDPB	REG2,BPREG
	IDPB	REG3,BPREG
	JRST	.-6
	MOVE	REG1,BPREG
	IDPB	REG3,REG1
>
; (((↑↑↑)))
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	D$INP
	DCSOUT	<[ASCIZ/LIST /],ABUF,SEMI>
	CALLR	RENDER
	 JRST	D$IND
	MOVEI	FLAG,3
D$IN2:	TSOUT	<[ASCIZ/  [Password:/]>
	TSIN	(UBUF1,LBSIZE,<[ASCIZ/  [Password:/]>,NOECHO)
	 JRST	D$IN2
	TSOUT	<[ASCIZ/]/],CRLF>
	MOVE	REG2,BPREG
	MOVEI	REG1,"("
	IDPB	REG1,REG2
	MOVEI	REG1,"'"
	IDPB	REG1,REG2
	MOVE	REG1,[440700,,UBUF1]
	SCOPY	(REG1,REG2)
	MOVEI	REG1,"'"
	IDPB	REG1,REG2
	MOVEI	REG1,")"
	IDPB	REG1,REG2
	SETZ	REG1,
	IDPB	REG1,REG2
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	D$INP
	TSOUT	<[ASCIZ/   (Incorrect password.)/],CRLF>
	SOJG	FLAG,D$IN2
	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
D$IND:	MOVE	REG1,[point 7,[ASCIZ/%TOP.DFTP.DFTP.GUEST/]]
	MOVE	REG2,[point 7,ABUF]
	SCOPY	(REG1,REG2)
	DCSOUT	<[ASCIZ/LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	TSOUT	<[ASCIZ/  (as DFTP.GUEST)/],CRLF>
D$INP:	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<GET"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<PUT"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<TERSE"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<VERBOSE"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	MOVE	UTIL,[ASCII/%LOGI/]
	MOVEM	UTIL,CONTEX
	MOVE	UTIL,[ASCII/N/]
	MOVEM	UTIL,<CONTEX+1>
	SETZM	OPENED
	CALLR	D$CON
	ENDR

; D$CON -- CONNECT
;
D$CON:	BEGINR	<UTIL>
	CALLR	NETDSI
	DCSOUT	<[ASCIZ/CONNECT "<GET"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	CALLR	NETDSO
	DCSOUT	<[ASCIZ/CONNECT "<PUT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
; (((TENEX)))
IFG F.TENX,<
	GJINF
	MOVEM	REG2,LDIR
>
; (((↑↑↑)))
	ENDR

; D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
;   IN: IOREG -- MODE FLAG
;			READ IF < 0
;			WRITE IF = 0
;			APPEND IF > 0
;
D$OPEN:	BEGINR
	SKIPN	OPENED
	 JRST	D$OP05
	MOVE	REG1,[point 7,OPENED]
	MOVE	REG2,[point 7,NBUF]
D$OP01:	ILDB	REG3,REG1
	ILDB	REG4,REG2
	CAIE	REG3,(REG4)
	 JRST	D$OP05
	JUMPN	REG3,D$OP01
	CAMN	IOREG,OPENEM
	 RETURN	SKIP,1
	JUMPE	IOREG,D$OP02
	JUMPG	IOREG,D$OP03
	DCSOUT	<[ASCIZ/MODE "<FILES"> READ/],SEMI>
	JRST	D$OP04
D$OP02:	DCSOUT	<[ASCIZ/MODE "<FILES"> WRITE/],SEMI>
	JRST	D$OP04
D$OP03:	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
D$OP04:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEM	IOREG,OPENEM
	RETURN	SKIP,1
D$OP05:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	D$OP06
	TSOUT	<[ASCIZ/ (There are no <FILES>.)/],CRLF>
	RETURN
D$OP06:	SKIPN	OPENED
	 JRST	D$OP07
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SETZM	OPENED
D$OP07:	JUMPE	IOREG,D$OP08
	JUMPG	IOREG,D$OP09
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> READ/],SEMI>
	JRST	D$OP10
D$OP08:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> WRITE/],SEMI>
	JRST	D$OP10
D$OP09:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
D$OP10:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	REG1,[point 7,NBUF]
	MOVE	REG2,[point 7,OPENED]
	SCOPY	(REG1,REG2)
	MOVEM	IOREG,OPENEM
	ENDR	SKIP,1

; D$VER -- PRODUCE PROPER VERSION NUMBER
;   IN: IOREG -- DEFAULT FLAG
;			SMALLEST undeleted VERSION IF < 0
;			LARGEST VERSION IF = 0
;			largest deleted version if = "d"
;			LARGEST UNDELETED VERSION IF = " "
;   OUT: IOREG -- VERSION (IF DEFAULT)
;
D$VER:	BEGINR	<UTIL>
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPE	IOREG,D$VER1
	LDB	UTIL,[350700,,FBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	LDB	UTIL,[350700,,EBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPG	IOREG,D$VER2
	DCSOUT	<[ASCIZ/BEGIN
	DECLARE LEAST INT
	LEAST=-1
	FOR "<FILES">
	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
	      and (status eq ' ')/],[asciz/
	BEGIN
		IF LEAST EQ -1 THEN LEAST=VERSION ELSE
			IF LEAST GT VERSION THEN LEAST=VERSION
	END
	IF LEAST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
		COMMENT '}' ! LEAST
END/],SEMI>
	JRST	D$VERE
D$VER1:	DCSOUT	<[ASCIZ/BEGIN
	DECLARE GREATEST INT
	GREATEST=0
	FOR "<FILES">/]>
	CALLR	D$WITH
	DCSOUT	<[ASCIZ/
	BEGIN
		IF GREATEST LT VERSION THEN GREATEST=VERSION
	END
	COMMENT '}' ! GREATEST
END/],SEMI>
	JRST	D$VERE
D$VER2:	DCSOUT	<[ASCIZ/BEGIN
	DECLARE GREATEST INT
	GREATEST=-1
	FOR "<FILES">
	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
	      AND (STATUS EQ '/]>
	DCBOUT	<IOREG>
	SKIPN	FLAGDD
	 JRST	D$VER$
	TBOUT	<IOREG>
D$VER$:	DCSOUT	<[ASCIZ/')
	BEGIN
		IF GREATEST LT VERSION THEN GREATEST=VERSION
	END
	IF GREATEST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
		COMMENT '}' ! GREATEST
END/],SEMI>
D$VERE:	SETOM	FLAGDE
	CALLR	RENDEM
	 RETURN
	MOVE	IOREG,[ASCII/;A282/]
	CALLR	RENFIP
	 RETURN
D$VERN:	DCBIN	<IOREG>
	CAIE	IOREG,"}"
	 JRST	D$VERN
	CALLR	DCNIN
	MOVEM	IOREG,VBUF
	CALLR	RENLIN
	CALLR	RENDER
	 RETURN
	ENDR	SKIP,1

; D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
;   IN: IOREG -- POINTER TO FIXED QUALIFIER (OR 0)
;   FLAGS:
	D$W$F==400000
	D$W$E==200000
	D$W$V==100000
	D$W$Q==010000
;
D$WITH:	BEGINR	<UTIL,FLAG>
	SETZ	FLAG,
	LDB	UTIL,[350700,,FBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$F
	LDB	UTIL,[350700,,EBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$E
	SKIPLE	VBUF
	 TRO	FLAG,D$W$V
	SKIPE	IOREG
	 TRO	FLAG,D$W$Q
	JUMPE	FLAG,RETN(0)
	DCSOUT	<[ASCIZ/ WITH/]>
	TRNN	FLAG,D$W$F
	 JRST	D$WIT1
	DCSOUT	<[ASCIZ/ FILENAME EQ '/],FBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$E!D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT1:	TRNN	FLAG,D$W$E
	 JRST	D$WIT2
	DCSOUT	<[ASCIZ/ EXTENSION EQ '/],EBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT2:	TRNN	FLAG,D$W$V
	 JRST	D$WIT3
	DCSOUT	<[ASCIZ/ VERSION EQ /]>
	MOVE	UTIL,VBUF
	DCNOUT	<UTIL>
	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT3:	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<(IOREG)>
	ENDR

; NETSUM -- NETWORK CHECKSUM VERIFICATION
;
NETSUM:	BEGINR	<IOREG,FLAG>
	CALLR	RENPRE
	CAME	IOREG,[ASCII/;I275/]
	 JRST	NETS2
	SETZ	FLAG,
NETS1:	DCBIN	<IOREG>
	CAIE	IOREG,"="
	 JRST	NETS1
	SKIPN	FLAG
	 SOJA	FLAG,NETS1
	CALLR	DCNIN
	CAME	IOREG,NSUM
	 JRST	NETS3
	CALLR	RENLIN
	RETURN
NETS2:	CALLR	RENLIP
	RETURN
NETS3:	CALLR	RENLIN
	TSOUT	<[ASCIZ/ (Network Checksum Error.)/],CRLF>
	ENDR

; NETRAT -- CALCULATE AND PRINT RATE
;
NETRAT:	BEGINR	<IOREG,<IOREG+1>>
	TSOUT	<[ASCIZ/ (/]>
	MOVEI	IOREG,↑D36
	IMULB	IOREG,NSIZE
	IDIV	IOREG,NTIME
	TNOUT	<IOREG>
	TSOUT	<[ASCIZ/ Baud (/]>
	MOVE	IOREG,NSIZE
	TNOUT	<IOREG>
	TSOUT	<[ASCIZ/ bits in /]>
	MOVE	IOREG,NTIME
	CAIN	IOREG,0
	 MOVEI	IOREG,1
	TNOUT	<IOREG>
	HRRZI	<IOREG+1>,[ASCIZ/ seconds))/]
	CAIN	IOREG,1
	 HRRZI	<IOREG+1>,[ASCIZ/ second))/]
	TSOUT	<(IOREG+1),CRLF>
	ENDR

; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	FLAG,
RENDSL:	CALLR	RENPRE
	CAMN	IOREG,[ASCII/.I220/]
	 JRST	RENDES
	CAMN	IOREG,[ASCII/.I210/]
	 JRST	RENDRR
	CAMN	IOREG,[ASCII/;A282/]
	 JRST	RENDPM
	CAMN	IOREG,[ASCII/.J151/]
	 JRST	RENDPM
	LDB	UTIL,[350700,,IOREG]
	cain	util,"+"
	 jrst	rendmm
	CAIN	UTIL,"-"
	 JRST	RENDMM
	JRST	RENDFL
RENDMM:	SETO	FLAG,
	SKIPN	FLAGDE
	 JRST	RENDFL
	SETZM	FLAGDE
RENDPM:	CALLR	RENLIP
	JRST	RENDSL
RENDFL:	CALLR	RENLIN
	JRST	RENDSL
RENDES:	CALLR	RENLIN
	MOVEI	IOREG,"L"-100
	DCBOUT	<IOREG>
	SETO	FLAG,
	JRST	RENDSL
RENDRR:	CALLR	RENLIN
	JUMPN	FLAG,RETN(0)
	ENDR	SKIP,1

; RENDEM -- REQUEST ENDER FOR MULTIPLE LINE REQUESTS
;
RENDEM:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	FLAG,
RENMSL:	CALLR	RENPRE
	CAMN	IOREG,[ASCII/.I210/]
	 JRST	RENMFL
	CAMN	IOREG,[ASCII/.I220/]
	 JRST	RENMES
	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"+"
	 JRST	RENMMM
	CAIN	UTIL,"-"
	 JRST	RENMMM
	JRST	RENMEM
RENMMM:	SKIPN	FLAG
	 MOVEI	FLAG,-1
	SKIPN	FLAGDE
	 JRST	RENMEM
	SETZM	FLAGDE
	CALLR	RENLIP
	JRST	RENMER
RENMEM:	CALLR	RENLIN
RENMER:	JUMPN	FLAG,RENMSL
	RETURN	SKIP,1
RENMFL:	CALLR	RENLIN
	JUMPE	FLAG,RENMSL
	RETURN
RENMES:	CALLR	RENLIN
	JUMPL	FLAG,RENMSL
	MOVEI	IOREG,"L"-100
	DCBOUT	<IOREG>
	SETO	FLAG,
	JRST	RENMSL
	ENDR

; RENFIP -- FIND PREFIX (ASSUMES INITIAL RENLIN)
;   IN: IOREG -- PREFIX
;
RENFIP:	BEGINR	<BPREG,UTIL,FLAG>
	MOVE	FLAG,IOREG
	SETZ	UTIL,
RENFIL:	CALLR	RENPRE
	CAMN	IOREG,FLAG
	 RETURN	SKIP,1
	LDB	BPREG,[350700,,IOREG]
	CAIN	BPREG,";"
	 JRST	RENFIN
	CAIN	BPREG,"."
	 JRST	RENFIN
	SKIPN	UTIL
	 CALLR	RENLIP
	SKIPE	UTIL
	 CALLR	RENLIN
	AOJA	UTIL,RENFIL
RENFIN:	CALLR	RENLIN
	CAMN	IOREG,[ASCII/.I220/]
	 JRST	RENFIS
	CAMN	IOREG,[ASCII/.I210/]
	 RETURN
	JRST	RENFIL
RENFIS:	MOVEI	IOREG,"L"-100
	DCBOUT	<IOREG>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR	<IOREG>
RENLNL:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR	<IOREG>
	SKIPN	FLAGDD
	 JRST	RENLPF
RENLPL:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	RENLPL
	RETURN
RENLPF:	DCBIN	<IOREG>
	CAIN	IOREG,12
	 RETURN
	CAIE	IOREG,11
	 JRST	RENLPF
	MOVEI	IOREG," "
	TBOUT	<IOREG>
	MOVEI	IOREG,"("
RENLPP:	TBOUT	<IOREG>
RENLPQ:	DCBIN	<IOREG>
	CAIN	IOREG,42
	 JRST	RENLPQ
	CAIE	IOREG,15
	 JRST	RENLPP
	DCBIN	<IOREG>
	MOVEI	IOREG,")"
	TBOUT	<IOREG>
	TSOUT	<CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IOREG -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR	<BPREG,UTIL,FLAG>
renprp:	SETZ	IOREG,
	MOVE	BPREG,[point 7,IOREG]
	MOVEI	FLAG,5
RENPRL:	DCBIN	<UTIL>
	CAIN	UTIL,15
	 JRST	RENPRL
	CAIN	UTIL,12
	 JRST	RENPRL
	IDPB	UTIL,BPREG
	SOJG	FLAG,RENPRL
	ldb	util,[350700,,ioreg]
	cain	util,"?"
	 jrst	death
	caie	util,"!"
	 return
	callr	renlip
	jrst	renprp
	ENDR

; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR	RENLIP
	TSOUT	<[ASCIZ/ ?? Fatal Datacomputer Error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
	.VALUE
	.BREAK 16,160000
>
; (((TOPS-10)))
IFE F.TENX,<
	EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	HALTF
	JRST	.-1
>
; (((↑↑↑)))


; ***I/O ROUTINES***

; TAIN -- TERMINAL AUTHORIZATION INPUT
;   IN: REG1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$:	BEGINR	<IOREG>
	MOVEI	IOREG,(REG1)
	TSOUT	<(IOREG)>
TAIN1:	TBIN	<IOREG>
	CAIN	IOREG,15
	 JRST	TAIN1
	CAIN	IOREG,"R"-100
	 JRST	TAIN1
	CAIN	IOREG,"N"
	 JRST	TAIN2
	CAIN	IOREG,"Y"
	 JRST	TAIN3
	CAIN	IOREG,12
	 JRST	TAIN4
	CAIN	IOREG,33
	 JRST	TAIN4
	CAIN	IOREG,37
	 JRST	TAIN4
	CAIN	IOREG," "
	 JRST	TAIN4
	TSOUT	<[ASCIZ/XXX/],CRLF>
	RETURN
TAIN2:	TSOUT	<[ASCIZ/No/],CRLF>
	RETURN	SKIP,1
TAIN3:	TSOUT	<[ASCIZ/Yes/]>
TAIN4:	TSOUT	<CRLF>
	ENDR	SKIP,2

; TERMINAL COMMAND INPUT ROUTINE
;
;   WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
;     INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
;   IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
;     LINE FEED, EOL, OR SPACE WILL FINISH IT.
;     IF NOT, SUCH CHARACTERS WILL BE REJECTED.
;   ↑A DELETES THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
;     ↑X AND RUBOUT DELETES THE LINE (RETURN TCIO=-1).
;
;	IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
;			POINTER TO COMMAND STRING LIST
;			NUMBER OF COMMANDS
;			NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
;			NUMBER OF WORDS IN LARGEST COMMAND STRING
;			<VALUE LIST>
;			<COMMAND STRING LIST>
;	OUT: TCIO -- LAST CHAR INPUT
;	     FLAG -- COMMAND VALUE
;	RETURNS: SKIP,0 -- DELETE LINE
;		 SKIP,1 -- NULL COMMAND
;		 SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$:	BEGINR	<TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
	MOVE	TCIACB,TCIO
	SETZ	UTIL,
TCII01:	MOVEM	UTIL,TCIPCL(UTIL)
	ADDI	UTIL,1
	CAME	UTIL,1(TCIACB)
	 JRST	TCII01
	ADDI	UTIL,TCIPCL
	MOVEM	UTIL,TCIPNF
	HRRI	UTIL,TCIPCL
	HRL	UTIL,1(TCIACB)
	MOVEM	UTIL,TCIPLP
	MOVE	TCIBP,[point 7,ABUF]
	HRLI	TCISBP,350700
	HRR	TCISBP,(TCIACB)
	SETZ	TCISCC,
TCICHR:	TBIN	<TCIO>
	CAIN	TCIO,"R"-100
	 JRST	TCIREP
	CAIN	TCIO,"?"
	 JRST	TCIQUA
	CAIN	TCIO,"A"-100
	 JRST	TCIDEL
	CAIN	TCIO,"X"-100
	 JRST	TCIENR
	CAIN	TCIO,177
	 JRST	TCIENR
	CAIN	TCIO,15
	 JRST	TCICHR
	CAIN	TCIO,12
	 JRST	TCIC01
	CAIN	TCIO,37
	 JRST	TCIC01
	CAIN	TCIO," "
	 JRST	TCIC01
	CAIN	TCIO,33
	 JRST	TCIC01
	CAIG	TCIO," "
	 JRST	TCIBAD
	JRST	TCIC02
TCIC01:	JUMPE	TCISCC,TCIENN
	HLRZ	UTIL,TCIPLP(TCISCC)
	CAIN	UTIL,1		; OK IF JUST ONE POSSIBILITY
	 JRST	TCIEND
TCIC02:	SETZ	TCIPCC,
	MOVE	TCIPBP,TCISBP
	MOVE	UTIL,TCIPNF
	MOVEM	UTIL,<TCIPLP+1>(TCISCC)
	SETZ	TCIMAC,
	HRRZI	TCIMAN,-1
TCIC03:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC04
	CAIE	UTIL,(TCIO)
	 JRST	TCIC08
TCIC04:	HLRZ	TCITCC,TCIPLP(TCISCC)
	HRRZ	TCITLP,TCIPLP(TCISCC)
TCIC05:	MOVE	UTIL,(TCITLP)
	CAIN	UTIL,(TCIPCC)
	 JRST	TCIC06
	AOJ	TCITLP,
	SOJG	TCITCC,TCIC05
	JRST	TCIC08
TCIC06:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC07
	AOJ	TCIMAC,
	MOVEM	TCIPCC,@TCIPNF
	AOS	TCIPNF
	JRST	TCIC08
TCIC07:	CAIN	TCIMAN,-1
	 SETO	TCIMAN,
	CAIE	TCIMAN,-1
	 HRRZI	TCIMAN,(TCIPCC)
TCIC08:	ADD	TCIPBP,3(TCIACB)
	AOJ	TCIPCC,
	CAME	TCIPCC,1(TCIACB)
	 JRST	TCIC03
	CAIN	TCIO,12
	 JRST	TCIC09
	CAIN	TCIO,37
	 JRST	TCIC09
	CAIN	TCIO," "
	 JRST	TCIC09
	CAIE	TCIO,33
	 JRST	TCIC10
TCIC09:	JUMPL	TCIMAN,TCIBAD
	CAIN	TCIMAN,-1
	 JRST	TCIBAD
	JRST	TCIEND
TCIC10:	JUMPE	TCIMAC,TCIBAD
	AOJ	TCISCC,
	HRLM	TCIMAC,TCIPLP(TCISCC)
	IBP	TCISBP
	IDPB	TCIO,TCIBP
	TBOUT	<TCIO>		; ECHO
	JRST	TCICHR
TCIBAD:	MOVEI	TCIO,"G"-100
	TBOUT	<TCIO>
	JRST	TCICHR
TCIREP:	TSOUT	<CRLF>
	HLRZ	UTIL,TCIACB
	TSOUT	<(UTIL)>
	HRRZI	TCIPCC,(TCISCC)	; OUTPUT LOOP CONTROL = CHARS SO FAR
	MOVE	TCIPBP,[point 7,ABUF]
TCIR01:	SOJL	TCIPCC,TCICHR
	ILDB	TCIO,TCIPBP
	TBOUT	<TCIO>
	JRST	TCIR01
TCIQUA:	TBOUT	<TCIO>		; PRINT "?"
	HLRZ	TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
	HRRZ	TCIPBP,TCIPLP(TCISCC)
TCIQ01:	TSOUT	<CRLF>
	MOVEI	TCIO,11
	TBOUT	<TCIO>
	MOVE	TCITCC,2(TCIACB)
	MOVE	TCITLP,(TCIPBP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,(point 7,)
TCIQ02:	ILDB	TCIO,TCITLP
	JUMPE	TCIO,TCIQ03
	TBOUT	<TCIO>
	SOJG	TCITCC,TCIQ02
TCIQ03:	AOJ	TCIPBP,
	SOJG	TCIPCC,TCIQ01
	JRST	TCIREP
TCIDEL:	JUMPLE	TCISCC,TCIBAD	; THERE'S NO CHARACTER TO DELETE
	MOVEI	TCIO,"\"
	TBOUT	<TCIO>
	LDB	TCIO,TCIBP
	TBOUT	<TCIO>
	SOJ	TCIBP,		; FIX LINE BYTE PTR
	IBP	TCIBP
	IBP	TCIBP
	IBP	TCIBP
	IBP	TCIBP
	HRRZ	UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
	MOVEM	UTIL,TCIPNF
	SOJ	TCISBP,		; FIX SCAN BYTE PTR
	IBP	TCISBP
	IBP	TCISBP
	IBP	TCISBP
	IBP	TCISBP
	SOJA	TCISCC,TCICHR
TCIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETZ	FLAG,
	RETURN
TCIENN:	SETZ	FLAG,
	RETURN	SKIP,1
TCIEND:	MOVE	TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
	MOVE	TCITLP,(TCITLP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,(point 7,)
	SETZ	TCITCC,
TCIE01:	IBP	TCITLP
	AOJ	TCITCC,
	CAIE	TCITCC,(TCISCC)
	 JRST	TCIE01
TCIE02:	AOJ	TCITCC,
	CAMLE	TCITCC,2(TCIACB)
	 JRST	TCIE03
	ILDB	TCIMAC,TCITLP
	JUMPE	TCIMAC,TCIE03
	TBOUT	<TCIMAC>
	JRST	TCIE02
TCIE03:	MOVE	TCITLP,TCIPLP(TCISCC)
	MOVE	FLAG,(TCITLP)
	ADDI	FLAG,4(TCIACB)
	MOVE	FLAG,(FLAG)
	ENDR	SKIP,2

; TERMINAL STRING INPUT
;   IN: IOREG -- POINTER TO BUFFER,,SIZE OF BUFFER
;	UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
;   OUT: IOREG -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
;        UTIL -- COUNT OF CHARACTERS
;
$TSIN$:	BEGINR	<BPREG,R10,R11,R12>
	MOVE	R10,IOREG
	MOVE	R11,UTIL
	HLR	BPREG,IOREG
	HRLI	BPREG,(point 7,)
	SETZ	UTIL,
TSICHR:	TBIN	<IOREG>
	CAIN	IOREG,"R"-100
	 JRST	TSIREP
	CAIN	IOREG,"A"-100
	 JRST	TSIDEL
	CAIN	IOREG,"X"-100
	 JRST	TSIENR
	CAIN	IOREG,177
	 JRST	TSIENR
	CAIN	IOREG,15
	 JRST	TSICHR
	CAIN	IOREG,12
	 JRST	TSIEND
	CAIN	IOREG,33
	 JRST	TSIEND
	CAIN	IOREG,37
	 JRST	TSIEND
	CAIGE	IOREG," "
	 JRST	TSIBAD
	CAIL	UTIL,(R10)
	 JRST	TSIBAD
	IDPB	IOREG,BPREG
	ADDI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IOREG>
	JRST	TSICHR
TSIBAD:	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	TSICHR
TSIREP:	TSOUT	<CRLF>
	TSOUT	<(R11)>
	JUMPL	R11,TSICHR
	HRRZI	IOREG,(BPREG)
	HLR	R12,R10
	CAIGE	IOREG,(R12)
	 JRST	TSICHR
	HRLI	R12,(point 7,)
TSIR01:	CAMN	R12,BPREG
	 JRST	TSICHR
	ILDB	IOREG,R12
	TBOUT	<IOREG>
	JRST	TSIR01
TSIDEL:	JUMPE	UTIL,TSIBAD
	MOVEI	IOREG,"\"
	TBOUT	<IOREG>
	LDB	IOREG,BPREG
	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	SUBI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IOREG>
	JRST	TSICHR
TSIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETO	IOREG,
	SETZ	UTIL,
	RETURN
TSIEND:	SETZ	R12,
	IDPB	R12,BPREG
	ENDR	SKIP,1

; TERMINAL NUMBER INPUT
;   IN: IOREG -- POINTER TO ↑R TEXT,,RADIX
;   OUT: IOREG -- NUMBER
;
$TNIN$:	BEGINR	<BPREG,UTIL,FLAG>
	MOVE	UTIL,IOREG
	MOVE	BPREG,[point 7,UBUF1]
	SETZ	FLAG,
TNICHR:	TBIN	<IOREG>
	CAIN	IOREG,"R"-100
	 JRST	TNIREP
	CAIN	IOREG,"A"-100
	 JRST	TNIDEL
	CAIN	IOREG,"X"-100
	 JRST	TNIENR
	CAIN	IOREG,177
	 JRST	TNIENR
	CAIN	IOREG,15
	 JRST	TNICHR
	CAIN	IOREG,12
	 JRST	TNIEND
	CAIN	IOREG,33
	 JRST	TNIEND
	CAIN	IOREG,37
	 JRST	TNIEND
	CAIN	IOREG," "
	 JRST	TNIEND
	CAIGE	IOREG,"0"
	 JRST	TNIBAD
	CAIL	IOREG,"0"(UTIL)
	 JRST	TNIBAD
	CAILE	FLAG,12		; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
	 JRST	TNIBAD
	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	AOJA	FLAG,TNICHR
TNIBAD:	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	TNICHR
TNIREP:	TSOUT	<CRLF>
	HLRZ	IOREG,UTIL
	TSOUT	<(IOREG)>
	HRRZI	IOREG,(BPREG)
	CAIGE	IOREG,UBUF1
	 JRST	TNICHR
	MOVE	IOREG,[point 7,UBUF1]
TNIR01:	CAMN	IOREG,BPREG
	 JRST	TNICHR
	ILDB	REG1,IOREG
	TBOUT	<REG1>
	JRST	TNIR01
TNIDEL:	JUMPE	FLAG,TNIBAD
	MOVEI	IOREG,"\"
	TBOUT	<IOREG>
	LDB	IOREG,BPREG
	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	TBOUT	<IOREG>
	SOJA	FLAG,TNICHR
TNIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETZ	IOREG,
	RETURN
TNIEND:	SETZ	IOREG,
	IDPB	IOREG,BPREG
	MOVE	BPREG,[point 7,UBUF1]
	MOVEI	FLAG,(UTIL)
TNICAL:	ILDB	UTIL,BPREG
	JUMPE	UTIL,RETN(1)
	IMULI	IOREG,(FLAG)
	SUBI	UTIL,"0"
	ADDI	IOREG,(UTIL)
	JRST	TNICAL
	ENDR

; DCNIN -- DATACOMPUTER NUMBER INPUT
;   OUT: IOREG -- 36-BIT MAGNITUDE INTEGER
;
DCNIN:	BEGINR	<<IOREG+1>,UTIL>
	SETZ	IOREG,
DCNIN1:	DCBIN	<UTIL>
	CAIGE	UTIL,"0"
	 RETURN
	CAILE	UTIL,"9"
	 RETURN
	JUMPL	IOREG,DCNIN2
	MULI	IOREG,↑D10
	CAILE	IOREG,1
	 JRST	DCNIN2
	CAIN	IOREG,1
	 TLO	<IOREG+1>,400000
	MOVE	IOREG,<IOREG+1>
	ADDI	IOREG,-"0"(UTIL)
	JRST	DCNIN1
DCNIN2:	SETO	IOREG,
	JRST	DCNIN1
	ENDR

; $NOUT$ -- INTEGER OUTPUT
;   IN: REG1 -- INTEGER
;       REG2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$:	BEGINR	<FLAG>
	MOVE	FLAG,REG2
	MOVE	REG3,[point 7,UBUF1]
	MOVEI	REG4,1
	JUMPGE	REG1,NOUT1
	LSHC	REG1,-↑D35
	LSH	REG2,-1
	DIVI	REG1,(FLAG)
	JRST	.+2
NOUT1:	IDIVI	REG1,(FLAG)
	ADDI	REG2,60
	IDPB	REG2,REG3
	SKIPE	REG1
	 AOJA	REG4,NOUT1
	MOVE	REG1,[point 7,UBUF2]
NOUT2:	LDB	REG2,REG3
	IDPB	REG2,REG1
	SOJ	REG3,
	IBP	REG3
	IBP	REG3
	IBP	REG3
	IBP	REG3
	SOJG	REG4,NOUT2
	IDPB	REG4,REG1
	SKIPL	FLAG
	 JRST	NOUT3
	DCSOUT	<UBUF2>
	RETURN
NOUT3:	TSOUT	<UBUF2>
	ENDR


; ***SYSTEM DEPENDENT ROUTINES***

; (((ITS)))
IFL F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	.OPEN TTI,[.UAI,,'TTY']		; TTY input
	 THUD
	.CALL [	SETZ
		SIXBIT/TTYGET/		; set TTY parameters
		MOVEI TTI		; TTY channel
		MOVEM			; first set of character groups
		MOVEM			; second set of character groups
		SETZM REG1]		; TTYSTS variable
	 THUD
	TLO REG1,200			; disable **MORE** processing
	MOVE [030303,,030303]		; turn off echoing
	.CALL [	SETZ
		SIXBIT/TTYSET/		; set TTY parameters
		MOVEI TTI		; TTY channel
		MOVE			; first set of character groups
		MOVE			; second set of character groups
		SETZ REG1]		; TTYSTS variable
	 THUD
	.OPEN TTO,[.UAO,,'TTY']		; TTY output
	 THUD
	.CALL [	SETZ			; host number
		SIXBIT/NETHST/
		MOVEI -1
		MOVEM
		SETZM LHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .UII!40050	; OPEN on gensymmed socket, 32 bits
		MOVEI ICP
		[('NET')]		; network device
		[-1]			; initial local socket is gensymmed
		MOVEI DCSOKT		; initial foreign socket(DATACOMPUTER)
		SETZI DCHOST]		; foreign host(CCA)
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI ICP
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	MOVE REG1,[ICP,,RCHBLK]
	.RCHST REG1,			; get status of network channel
	HRRE REG1,RCHBLK+4		; get status of network
	JUMPL REG1,NETDED		; network dead if .LE. 0
	CAIN REG1,%NSCLI		; CLS w/ input?
	 JRST ICPWIN
	CAIE REG1,%NSINP		; input available?
	 CAIN REG1,%NSOPN		; connection open?
	  JRST ICPWIN
	JUMPN REG1,[THUD]		; any other condition is lossage
ICPCLS:	TSOUT <[ASCIZ/Cannot establish network connection/]>
	.BREAK 16,160000
NETDED:	TSOUT <[ASCIZ/ARPAnet is down/]>
	.BREAK 16,160000
ICPWIN:	MOVE REG1,RCHBLK+1		; get gensymmed local socket
	ADDI REG1,2			; receive
	MOVEM REG1,LCLRCV
	ADDI REG1,1			; transmit
	MOVEM REG1,LCLTRN
	.IOT ICP,REG1			; get foreign place's socket
	.CLOSE ICP,			; free up ICP socket right away
	MOVEM REG1,FORRCV		; receive
	ADDI REG1,1			; socket to me!
	MOVEM REG1,FORTRN
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAI
		MOVEI DCI		; DATACOMPUTER input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAO
		MOVEI DCO		; DATACOMPUTER output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCI
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCO
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	MOVEI REG1,2			; offset for data sockets
	ADDM REG1,LCLRCV
	ADDM REG1,LCLTRN
	ADDM REG1,FORRCV
	ADDM REG1,FORTRN
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	.IOT DCO,["Z"-100]		; SEND QUIT
QUIT1:	DCBIN <IOREG>
	JUMPGE IOREG,QUIT1
	.CLOSE DCI,
	.CLOSE DCO,
	.BREAK 16,160000

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI DDI		; DATACOMPUTER data input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDI
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	RETURN SKIP,1
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI DDO		; DATACOMPUTER data output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDO
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	RETURN SKIP,1
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	.CLOSE DDI,
	.CLOSE DDO,
	ENDR

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;
NETDSI:	BEGINR
	MOVE UTIL,LCLRCV
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;
NETDSO:	BEGINR
	MOVE UTIL,LCLTRN
	ENDR

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI LCI
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCOI1
	RETURN SKIP,1
LOCOI1:	TSOUT <[ASCIZ/ (Local file not found.)/],CRLF>
	ENDR

;LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI LCO
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCOO1
	.CALL [	SETZ
		SIXBIT/SFDATE/
		MOVEI LCO
		SETZ LCLDAT]
	 THUD
	RETURN SKIP,1
LOCOO1:	TSOUT <[ASCIZ/ ?? Local file creation failure ??/],CRLF>
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	.CLOSE LCI,
	.CLOSE LCO,
	ENDR

; LOCS -- LOCAL FILE (SIZE)
;
LOCS:	BEGINR
	.CALL [	SETZ
		SIXBIT/FILLEN/
		MOVEI LCI
		SETZM IOREG]
	 SETZ IOREG,			; it should not crap out
	ENDR

; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IOREG -- ADDRESS OF TIME STRING
;  OUT:	UTIL -- ITS DISK FORMAT DATE/TIME
;
LUTTSN:	BEGINR <BPREG>
	SETZ UTIL,
	ILDB REG1,IOREG
	CAIL REG1,"0"
	 CAILE REG1,"9"
	  RETURN
	SUBI REG1,"0"
	IMULI REG1,↑D10
	ILDB REG2,IOREG
	CAIL REG2,"0"
	 CAILE REG2,"9"
	  RETURN
	ADDI REG1,-"0"(REG2)
	ILDB REG2,IOREG
	CAIE REG2,"-"
	 RETURN
	MOVE REG2,[POINT 7,REG3]
	SETZ REG3,
REPEAT 3,<
	ILDB REG4,IOREG
	IDPB REG4,REG2
>
	MOVEI REG2,↑D12
	CAMN REG3,LUTTM-1(REG2)
	 JRST .+3
	  SOJGE REG2,.-2
	  RETURN
	ILDB REG3,IOREG
	CAIE REG3,"-"
	 RETURN
	ILDB REG3,IOREG
	CAIL REG3,"0"
	 CAILE REG3,"9"
	  RETURN
	SUBI REG3,"0"
	IMULI REG3,↑D10
	ILDB REG4,IOREG
	CAIL REG4,"0"
	 CAILE REG4,"9"
	  RETURN
	ADDI REG3,-"0"(REG4)
	DPB REG3,[POiNT 7,UTIL,8]
	DPB REG2,[POINT 4,UTIL,12]
	DPB REG1,[POINT 5,UTIL,17]
	ILDB REG1,IOREG
	CAIE REG1," "
	 RETURN
	ILDB REG1,IOREG
	SUBI REG1,"0"
	IMULI REG1,↑D10
	ILDB REG2,IOREG
	ADDI REG1,-"0"(REG2)
	IMULI REG1,6
	ILDB REG2,IOREG
	CAIE REG2,":"
	 RETURN
	ILDB REG2,IOREG
	ADDI REG1,-"0"(REG2)
	IMULI REG1,↑D10
	ILDB REG2,IOREG
	ADDI REG1,-"0"(REG2)
	IMULI REG1,6
	ILDB REG2,IOREG
	CAIE REG2,":"
	 jrst [	IMULI REG1,↑D20
		JRST LUTSN1]
	ILDB REG2,IOREG
	ADDI REG1,-"0"(REG2)
	IMULI REG1,↑D10
	ILDB REG2,IOREG
	ADDI REG1,-"0"(REG2)
	LSH REG1,1
LUTSN1:	ADDI UTIL,(REG1)
	ENDR

; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN:	UTIL -- ITS DISK FORMAT DATE/TIME
;	BPREG -- BYTE POINTER TO DESTINATION STRING
;  OUT:	BPREG -- UPDATED BYTE POINTER
;
LUTTNS:	BEGINR
	LDB REG3,[POINT 5,UTIL,17]	; DAY
	IDIVI REG3,↑D10
	ADDI REG3,"0"
	ADDI REG4,"0"
	IDPB REG3,BPREG
	IDPB REG4,BPREG
	MOVEI REG3,"-"
	IDPB REG3,BPREG
	LDB REG3,[POINT 4,UTIL,12]	; MONTH
	HRRI REG3,LUTTM-1(REG3)
	HRLI REG3,(POINT 7,)
	SCOPY (REG3,BPREG)
	MOVEI REG3,"-"
	IDPB REG3,BPREG
	LDB REG3,[POINT 7,UTIL,8]	; YEAR
	IDIVI REG3,↑D10
	ADDI REG3,"0"
	ADDI REG4,"0"
	IDPB REG3,BPREG
	IDPB REG4,BPREG
	MOVEI REG3," "
	IDPB REG3,BPREG
	LDB REG2,[POINT 17,UTIL,34]	; TIME IN SECONDS
	IDIVI REG2,↑D3600
	MOVEI REG4,(REG3)
	IDIVI REG2,↑D10
	ADDI REG2,"0"
	ADDI REG3,"0"
	IDPB REG2,BPREG
	IDPB REG3,BPREG
	MOVEI REG2,":"
	IDPB REG2,BPREG
	MOVEI REG2,(REG4)
	IDIVI REG2,↑D60
	MOVEI REG4,(REG3)
	IDIVI REG2,↑D10
	ADDI REG2,"0"
	ADDI REG3,"0"
	IDPB REG2,BPREG
	IDPB REG3,BPREG
	MOVEI REG2,":"
	IDPB REG2,BPREG
	MOVEI REG2,(REG4)
	IDIVI REG2,↑D10
	ADDI REG2,"0"
	ADDI REG3,"0"
	IDPB REG2,BPREG
	IDPB REG3,BPREG
	SETZ REG2,
	IDPB REG2,BPREG
	ENDR				; return

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII/JAN/
	ASCII/FEB/
	ASCII/MAR/
	ASCII/APR/
	ASCII/MAY/
	ASCII/JUN/
	ASCII/JUL/
	ASCII/AUG/
	ASCII/SEP/
	ASCII/OCT/
	ASCII/NOV/
	ASCII/DEC/

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR <IOREG>
	SETZM LCLFN1			; < prevent assembly error
	MOVSI REG1,'>  '
	MOVEM REG1,LCLFN2
	HRLI IOREG,(POINT 7,)
LUTFN1:	CALLR LUTWRD			; get a SIXBIT word
	MOVEM REG1,LCLFN1
	JUMPE REG2,RETN(0)
	CAIE REG2,"."
	 JRST LUTFN1
	CALLR LUTWRD
	CAIE REG1,
	 MOVEM REG1,LCLFN2		; use FN2 if specified
	ENDR

; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN REG1, DELIMITER IN REG2
;
LUTWRD:	BEGINR <BPREG>
	SETZ REG1,			; initialize word, word pointer
	MOVE BPREG,[POINT 6,REG1]
LUTWR1:	ILDB REG2,IOREG			; get a character from buffer
	CAIN REG2,"."
	 JRST RETN(0)
	JUMPE REG2,RETN(0)
	SUBI REG2," "			; SIXBITify from ASCII
	TRNN REG1,77			; and save in word until word filled
	 IDPB REG2,BPREG
	JRST LUTWR1
	ENDR

; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETZM FFITYP
	SETO REG1,
	CAME REG1,FSBUF
	 CAMN REG1,ESBUF
	  CAIA
	   JRST NETFI1
	.IOT TTO,[" "]
	.IOT TTO,["("]
	SETOM FFITYP
NETFI1:	MOVE REG1,[POINT 6,LCLFN1]
	MOVEI REG2,6
	MOVE REG3,[POINT 7,FBUF]
	ILDB REG4,REG1
	JUMPE REG4,.+4
	ADDI REG4," "
	SKIPE FFITYP
	 .IOT TTO,REG4
	SKIPE GBUF1
	 IDPB REG4,REG3
	SOJG REG2,.-7
NETFI2:	SKIPE FFITYP
	 .IOT TTO,["."]
	MOVE REG1,[POINT 6,LCLFN2]
	MOVEI REG2,6
	MOVE REG3,[POINT 7,EBUF]
	ILDB REG4,REG1
	JUMPE REG4,.+4
	ADDI REG4," "
	SKIPE FFITYP
	 .IOT TTO,REG4
	SKIPE GBUF2
	 IDPB REG4,REG3
	SOJG REG2,.-7
NETFI3:	SKIPN FFITYP
	 RETURN
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR <IOREG,BPREG,UTIL>
	SETZM IOBUFR
	MOVE REG1,[IOBUFR,,IOBUFR+1]
	BLT REG1,IOBUFR+1777
	.RDTIM REG1,
	IDIVI REG1,↑D30
	MOVEM REG1,NTIME
	MOVE BPREG,[POINT 7,IOBUFR]
	MOVE UTIL,[POINT 7,FBUF]
	SCOPY (UTIL,BPREG)
	MOVE BPREG,UTIL
	MOVE UTIL,[POINT 7,EBUF]
	SCOPY (UTIL,BPREG)
	MOVE BPREG,UTIL
	.CALL [	SETZ
		SIXBIT/RFDATE/
		MOVEI LCI
		SETZM UTIL]
	 MOVSI UTIL,124201
	CALLR LUTTNS
	.CALL [	SETZ
		SIXBIT/RQDATE/
		SETZM UTIL]
	 MOVSI UTIL,124201
	CALLR LUTTNS
	HRLI BPREG,004400
	MOVE UTIL,VBUF
	IDPB UTIL,BPREG
	CALLR LOCS
	IDPB IOREG,BPREG
	MOVNI UTIL,17
	IDPB UTIL,BPREG
	HRRZI BPREG,(BPREG)
	MOVEI REG1,(BPREG)
	SUBI BPREG,IOBUFR-1
	MOVEM BPREG,NSIZE
	SETZ UTIL,
	ADD UTIL,(REG1)
	SOJ REG1,
	SOJG BPREG,.-2
	ADDM UTIL,NSUM
	MOVN REG1,NSIZE
	HRLS REG1
	HRRI REG1,IOBUFR
	.IOT DDO,REG1
	ENDR

; putdat -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
PUTDAT:	BEGINR <UTIL,IOREG>
	CALLR LOCS			; get length of file
	AOS NSIZE
	ADDM IOREG,NSUM
	ADDM IOREG,NSIZE
	MOVE REG1,[-1,,IOREG]
	.IOT DDO,REG1
	SETZ UTIL,
PUTD1:	MOVE REG1,[-2000,,IOBUFR]
	.IOT LCI,REG1			; read 1K from local file
	JUMPL REG1,PUTD2		; hit EOF here
	MOVE REG1,[-2000,,IOBUFR]
	.IOT DDO,REG1
	MOVSI REG1,-2000		; compute checksum
	ADD UTIL,IOBUFR(REG1)
	AOBJN REG1,.-1
	JRST PUTD1
PUTD2:	MOVEI REG1,-IOBUFR(REG1)	; get # of words transferred
	JUMPE REG1,PUTD3
	MOVNS REG1
	HRLZS REG1
	PUSH STAK,REG1
	HRRI REG1,IOBUFR
	.IOT DDO,REG1
	POP STAK,REG1
	ADD UTIL,IOBUFR(REG1)
	AOBJN REG1,.-1
PUTD3:	ADDM UTIL,NSUM
	ADDM UTIL,NSUM
	MOVE REG1,[-1,,UTIL]
	.IOT DDO,REG1
	.RDTIM REG1,
	IDIVI REG1,↑D30
	SUBM REG1,NTIME
	ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR <IOREG,UTIL>
	.RDTIM REG1,
	IDIVI REG1,↑D30
	MOVEM REG1,NTIME
	MOVE IOREG,[-GET$F,,FBUF]
	.IOT DDI,IOREG
	JUMPL IOREG,RETN(0)
	MOVEI IOREG,GET$F
	MOVEM IOREG,NSIZE
	SETZ UTIL,
	ADD UTIL,<FBUF-1>(IOREG)
	SOJG IOREG,.-1
	ADDM UTIL,NSUM
	MOVE IOREG,[-GET$E,,EBUF]
	.IOT DDI,IOREG
	MOVEI IOREG,GET$E
	ADDM IOREG,NSIZE
	SETZ UTIL,
	ADD UTIL,<EBUF-1>(IOREG)
	SOJG IOREG,.-1
	ADDM UTIL,NSUM
	MOVE IOREG,[-GET$D,,ABUF]
	.IOT DDI,IOREG
	MOVEI IOREG,GET$D
	ADDM IOREG,NSIZE
	SETZ UTIL,
	ADD UTIL,<ABUF-1>(IOREG)
	SOJG IOREG,.-1
	ADDM UTIL,NSUM
	MOVE IOREG,[POINT 7,ABUF]
	CALLR LUTTSN
	MOVEM UTIL,LCLDAT
	HRROI IOREG,ABUF
	.IOT DDI,IOREG
	AOS NSIZE
	MOVE REG1,ABUF
	ADDM REG1,NSUM
	HRROI IOREG,ABUF
	.IOT DDI,IOREG
	AOS NSIZE
	MOVE REG1,ABUF
	ADDM REG1,NSUM
	ENDR SKIP,1


; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR <IOREG,UTIL,FLAG>
	HRROI IOREG,FLAG
	.IOT DDI,IOREG
	JUMPE FLAG,GETD3
	ADDM FLAG,NSUM
	AOS NSIZE
	ADDM FLAG,NSIZE
	SETZ UTIL,
GETD1:	CAIGE FLAG,2000
	 JRST GETD2
	SUBI FLAG,2000
	MOVE REG1,[-2000,,IOBUFR]
	.IOT DDI,REG1			; read 1K from DATACOMPUTER
	MOVE REG1,[-2000,,IOBUFR]
	.IOT LCO,REG1
	MOVSI REG1,-2000		; compute checksum
	ADD UTIL,IOBUFR(REG1)
	AOBJN REG1,.-1
	JRST GETD1
GETD2:	JUMPE FLAG,GETD3
	MOVN REG1,FLAG
	HRLZS REG1
	HRRI REG1,IOBUFR
	PUSH STAK,REG1
	.IOT DDI,REG1
	MOVE REG1,(STAK)
	.IOT LCO,REG1
	POP STAK,REG1
	ADD UTIL,(REG1)
	AOBJN REG1,.-1
GETD3:	ADDM UTIL,NSUM
	HRROI IOREG,ABUF
	.IOT DDI,IOREG
	MOVE IOREG,ABUF
	ADDM IOREG,NSUM
	AOS NSIZE
	HRROI IOREG,ABUF
	.IOT DDI,IOREG
	MOVE IOREG,ABUF
	ADDM IOREG,NSUM
	AOS NSIZE
	CAMN IOREG,UTIL
	 JRST GETD4
	TSOUT <[ASCIZ/ (File Checksum Error.)/],CRLF>
GETD4:	.RDTIM REG1,
	IDIVI REG1,↑D30
	SUBM REG1,NTIME
	ENDR

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR <IOREG>
	SETZM GBUF1
	LDB REG1,[350700,,FBUF]
	CAIN REG1,"*"
	 SETOM GBUF1
	SETZM GBUF2
	LDB REG1,[350700,,EBUF]
	CAIN REG1,"*"
	 SETOM GBUF2
	SETO REG1,
	CAMN REG1,FSBUF
	 JRST LOCFI0
	CAMN REG1,ESBUF
	 JRST LOCFI0
	JRST LOCFI5
LOCFI0:	.OPEN [.BII,,'DSK'
	       SIXBIT/.FILE./
	       SIXBIT/(DIR)/]
	 RETURN
	MOVE REG1,[-2000,,DIRBLK]
	.IOT REG1
	.CLOSE
LOCFI1:	MOVE IOREG,DIRBLK+1		; POINTER TO NAME AREA
	ADDI IOREG,DIRBLK
	CAIN IOREG,DIRBLK+2000		; END OF DIRECTORY?
	 RETURN
	MOVEI REG1,5
	ADDM REG1,DIRBLK+1
	SETO REG1,
	CAME REG1,FSBUF
	 JRST LOCFI2
	CAME REG1,ESBUF
	 JRST LOCFI3
	JRST LOCFI4
LOCFI2:	MOVE REG1,[POINT 7,FSBUF]
	MOVE REG2,[POINT 6,REG4]
	MOVEI REG3,6
	SETZ REG4,
	ILDB REG1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB REG2
	SOJG REG3,.-6
	CAMN REG4,(IOREG)
	 JRST LOCFI4
	JRST LOCFI1

LOCFI3:	MOVE REG1,[POINT 7,ESBUF]
	MOVE REG2,[POINT 6,REG4]
	SETZ REG4,
	MOVEI REG3,6
	ILDB REG1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB REG2
	SOJG REG3,.-6
	CAME REG4,1(IOREG)
	 JRST LOCFI1
LOCFI4:	MOVE REG1,(IOREG)
	MOVEM REG1,LCLFN1
	MOVE REG1,1(IOREG)
	MOVEM REG1,LCLFN2
LOCFI5:	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .UAI
		MOVEI
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 RETURN
	.CLOSE
	ENDR SKIP,1

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR <IOREG>
	CALLR LOCC
	SETO REG1,
	CAMN REG1,FSBUF
	 JRST LOCNI0
	CAMN REG1,ESBUF
	 JRST LOCNI0
	RETURN SKIP,1
LOCNI0:	MOVE IOREG,DIRBLK+1
	ADDI IOREG,DIRBLK
	CAIN IOREG,DIRBLK+2000
	 RETURN SKIP,1
	MOVEI REG1,5
	ADDM REG1,DIRBLK+1
	SETO REG1,
	CAME REG1,FSBUF
	 JRST LOCNI1
	CAME REG1,ESBUF
	 JRST LOCNI2
	JRST LOCNI3
LOCNI1:	MOVE REG1,[POINT 7,FSBUF]
	MOVE REG2,[POINT 6,REG4]
	MOVEI REG3,6
	SETZ REG4,
	ILDB REG1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB REG2
	SOJG REG3,.-6
	CAMN REG4,(IOREG)
	 JRST LOCNI3
	JRST LOCNI0
LOCNI2:	MOVE REG1,[POINT 7,ESBUF]
	MOVE REG2,[POINT 6,REG4]
	MOVEI REG3,6
	SETZ REG4,
	ILDB REG1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB REG2
	SOJG REG3,.-6
	CAME REG4,1(IOREG)
	 JRST LOCNI0
LOCNI3:	MOVE REG1,(IOREG)
	MOVEM REG1,LCLFN1
	MOVE REG1,1(IOREG)
	MOVEM REG1,LCLFN2
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI LCI
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	JRST LOCNI0
	SKIPN GBUF1
	 JRST LOCNI4
	MOVE REG1,[POINT 6,LCLFN1]
	MOVEI REG2,6
	MOVE REG3,[POINT 7,FBUF]
	ILDB REG4,REG1
	SKIPE REG4
	 ADDI REG4,40
	IDPB REG4,REG3
	SOJG REG2,.-4
LOCNI4:	SKIPN GBUF2
	 JRST LOCNI5
	MOVE REG1,[POINT 6,LCLFN2]
	MOVEI REG2,6
	MOVE REG3,[POINT 7,EBUF]
	ILDB REG4,REG1
	SKIPE REG4
	 ADDI REG4,40
	IDPB REG4,REG3
	SOJG REG2,.-4
LOCNI5:	.IOT TTO,[" "]
	.IOT TTO,["("]
	TSOUT <FBUF>
	.IOT TTO,["."]
	TSOUT <EBUF>
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR

; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR <IOREG>
	SETZ REG1,
	SETO REG2,
	CAMN REG2,FSBUF
	 TRO REG1,400000
	CAMN REG2,ESBUF
	 TRO REG1,200000
	JUMPE REG1,RETN(0)
	MOVE REG2,[POINT 7,ABUF]
	MOVE REG3,[POINT 7,FSBUF]
	TRNE REG1,400000
	 HRRI REG3,FBUF
	ILDB REG4,REG3
	CAIN REG4," "
	 SETZ REG4,
	IDPB REG4,REG2
	JUMPN REG4,.-4
	SKIPN ESBUF
	 JRST LOCNOO
	MOVEI REG4,"."
	DPB REG4,REG2
	MOVE REG3,[POINT 7,ESBUF]
	TRNE REG1,200000
	 HRRI REG3,EBUF
	ILDB REG4,REG3
	CAIN REG4," "
	 SETZ REG4,
	IDPB REG4,REG2
	JUMPN REG4,.-4
LOCNOO:	MOVEI IOREG,ABUF
	CALLR LUTFN
	.IOT TTO,[" "]
	.IOT TTO,["("]
	TSOUT ABUF
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	0,[SIXBIT/DFTP/]
	SETNAM	0,
	OPEN	0,[	200	; TURN OFF TTY ECHOING
			SIXBIT	/TTY/
			0]
	 THUD
	CALLR	ICP
	ENDR

; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR	<IOREG,UTIL>
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVEM	REG1,NTIME
	MOVE	IOREG,[-GET$F,,FBUF]
	CALLR	NUTFB
	 RETURN
	MOVEI	IOREG,GET$F
	MOVEM	IOREG,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(IOREG)
	SOJG	IOREG,.-1
	ADDM	UTIL,NSUM
	MOVE	IOREG,[GET$E,,EBUF]
	CALLR	NUTFB
	MOVEI	IOREG,GET$E
	ADDM	IOREG,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(IOREG)
	SOJG	IOREG,.-1
	ADDM	UTIL,NSUM
	MOVE	IOREG,[GET$D,,ABUF]
	CALLR	NUTFB
	MOVEI	IOREG,GET$D
	ADDM	IOREG,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<ABUF-1>(IOREG)
	SOJG	IOREG,.-1
	ADDM	UTIL,NSUM
	MOVE	IOREG,[point 7,ABUF]
	CALLR	LUTTSN
	DPB	IOREG,[001400,,LFILE+2]
	LSH	IOREG,-14
	DPB	IOREG,[170300,,LFILE+1]
	DPB	UTIL,[141300,,LFILE+2]
	MOVE	IOREG,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	REG1,ABUF
	ADDM	REG1,NSUM
	MOVE	IOREG,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	REG1,ABUF
	ADDM	REG1,NSUM
	SKIPLE	REG1
	 MOVE	REG1,LFCHAS
	SKIPGE	REG1
	 MOVN	REG1,REG1
	DPB	REG1,[270400,,LFILE+2]
	ENDR	SKIP,1

; GETDAT -- GET-RETRIEVE FILE DATA
GETDAT:	BEGINR	<IOREG,UTIL,FLAG>
	MOVE	IOREG,[1,,ABUF]
	CALLR	NUTFB
	MOVE	FLAG,ABUF
	JUMPE	FLAG,GETD2
	ADDM	FLAG,NSUM
	AOS	NSIZE
	ADDM	FLAG,NSIZE
	OUT	LFCHAN,
	 JRST	.+2
	THUD
	SETZ	UTIL,
GETD1:	CAIGE	FLAG,SIZBLK
	 HRLI	IOREG,(FLAG)
	CAIL	FLAG,SIZBLK
	 HRLI	IOREG,SIZBLK
	HRR	IOREG,LFOBUF+1
	ADDI	IOREG,1
	CALLR	NUTFB
	CAIGE	FLAG,SIZBLK
	 MOVEI	IOREG,(FLAG)
	CAIL	FLAG,SIZBLK
	 MOVEI	IOREG,SIZBLK
	SUBI	FLAG,(IOREG)
	HRRZ	REG1,LFOBUF+1
	ADDM	IOREG,LFOBUF+1
	ADDI	REG1,(IOREG)
	ADD	UTIL,(REG1)
	SOJ	REG1,
	SOJG	IOREG,.-2
	OUT	LFCHAN,
	 JRST	.+2
	THUD
	JUMPG	FLAG,GETD1
GETD2:	ADDM	UTIL,NSUM
	MOVE	IOREG,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IOREG,ABUF
	ADDM	IOREG,NSUM
	AOS	NSIZE
	MOVE	IOREG,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IOREG,ABUF
	ADDM	IOREG,NSUM
	AOS	NSIZE
	CAMN	IOREG,UTIL
	 JRST	GETD3
	TSOUT	<[ASCIZ/ (File Checksum Error.)/],CRLF>
GETD3:	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVE	REG2,NTIME
	SUB	REG1,REG2
	MOVEM	REG1,NTIME
	ENDR

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR	<IOREG,BPREG,UTIL>
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVEM	REG1,NTIME
	HRR	BPREG,DDOBUF+1
	HRLI	BPREG,010700
	MOVE	UTIL,[point 7,FBUF]
	SCOPY	(UTIL,BPREG)
	MOVE	BPREG,UTIL
	MOVE	UTIL,[point 7,EBUF]
	SCOPY	(UTIL,BPREG)
	MOVE	BPREG,UTIL
	LDB	IOREG,[001400,,LFILE+2] ; CREATION DATE
	LDB	UTIL,[170300,,LFILE+1]
	LSH	UTIL,14
	IORI	IOREG,(UTIL)
	LDB	UTIL,[141300,,LFILE+2] ; CREATION TIME
	CALLR	LUTTNS
	DATE	IOREG,
	MSTIME	REG1,
	IDIVI	REG1,<↑D1000*↑D60>
	MOVE	UTIL,REG1
	CALLR	LUTTNS
	HRLI	BPREG,004400
	MOVE	UTIL,VBUF
	IDPB	UTIL,BPREG
	CALLR	LOCS
	IDPB	IOREG,BPREG
	LDB	UTIL,[270400,,LFILE+2] ; DATA MODE
	SKIPE	UTIL
	 MOVN	UTIL,UTIL
	IDPB	UTIL,BPREG
	HRRZ	IOREG,DDOBUF+1
	MOVEM	BPREG,DDOBUF+1
	HRRZI	BPREG,(BPREG)
	HRRZI	REG1,(BPREG)
	SUBI	BPREG,-1(IOREG)
	MOVEM	BPREG,NSIZE
	SETZ	UTIL,
	ADD	UTIL,(REG1)
	SOJ	REG1,
	SOJG	BPREG,.-2
	ADDM	UTIL,NSUM
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	ENDR

; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR	<IOREG,UTIL>
	CALLR	LOCS
	AOS	NSIZE
	ADDM	IOREG,NSUM
	ADDM	IOREG,NSIZE
	AOS	DDOBUF+1
	MOVEM	IOREG,@DDOBUF+1
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	SETZ	UTIL,
PUTD1:	sosg lfibuf+2
	 in lfchan,
	  caia
	   jrst putd2
	ildb reg1,lfibuf+1
	ADD UTIL,REG1
	sosg ddobuf+2
	 out ddchan,
	  caia
	   thud
	idpb reg1,ddobuf+1
	jrst putd1
putd2:	stato lfchan,20000
	 thud
	aos	nsize
	ADDM	UTIL,NSUM
	ADDM	UTIL,NSUM
	AOS	DDOBUF+1
	MOVEM	UTIL,@DDOBUF+1
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVE	REG2,NTIME
	SUB	REG1,REG2
	MOVEM	REG1,NTIME
	ENDR

; TOPS-10 ICP:		1) SET CONNECTION SOCKETS IN LISTENING STATE
;			2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			3) OPEN CONNECTION SOCKETS
;				A) EVEN - RECEIVE
;				B) ODD - SEND
;
ICP:	BEGINR	<IOREG,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG:	SETZM	ICPBLK+.IBDEV
	SETZM	DCIBLK+.IBDEV
	SETZM	DCOBLK+.IBDEV
	SETZM	DCIBLK+.IBRMT
	SETZM	DCOBLK+.IBRMT
	MOVE	IOREG,LINP		; LISTEN ON INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	.+2
	JRST	ICPICP
	MOVE	IOREG,DCIBLK+.IBERR
	CAIE	IOREG,.IESKT
	 JRST	ICPEIL
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	LDB	REG4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,102
	SETZ	REG3,
	SETZ	FLAG,
ICPRDV:	MOVE	IOREG,[SIXBIT/IMP/]	; RESET DEVICE(S) USED
	MOVEM	IOREG,WRKBLK+.IBDEV
	MOVEI	REG1,(REG3)
	IDIVI	REG1,10
	JUMPE	REG1,ICPRD1
	ADDI	REG1,20
	ADDI	REG2,20
	DPB	REG1,[140600,,WRKBLK+.IBDEV]
	DPB	REG2,[060600,,WRKBLK+.IBDEV]
	JRST	ICPRD2
ICPRD1:	ADDI	REG2,20
	DPB	REG2,[140600,,WRKBLK+.IBDEV]
ICPRD2:	SETZM	WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]	; TEST STATUS OF SOCKET
	 JRST	ICPRD3
	HRRZ	IOREG,WRKBLK+.IBHST	; FOREIGN HOST
	CAIE	IOREG,DCHOST
	 JRST	ICPRD3
	PJOB	REG1,
	HLRZ	REG2,WRKBLK+.IBSTT	; OWNING JOB
	CAIE	REG2,(REG1)
	 JRST	ICPRD3
	MOVE	IOREG,WRKBLK+.IBLCL
	CAMN	IOREG,UTIL		; DATALANGUAGE SOCKET(S)
	 JRST	ICPCLS
	SUBI	IOREG,2
	CAMN	IOREG,UTIL		; INPUT DATA SOCKET
	 JRST	ICPCLI
ICPRD3:	MOVEI	IOREG,1			; OUTPUT DATA SOCKET
	MOVEM	IOREG,WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	HRRZ	IOREG,WRKBLK+.IBHST
	CAIE	IOREG,DCHOST
	 JRST	ICPRD4
	PJOB	REG1,
	HLRZ	REG2,WRKBLK+.IBSTT
	CAIE	REG2,(REG1)
	 JRST	ICPRD4
	MOVE	IOREG,WRKBLK+.IBLCL
	SUBI	IOREG,3
	CAMN	IOREG,UTIL
	 JRST	ICPCLO
ICPRD4:	ADDI	REG3,1
	CAIGE	REG3,(REG4)
	 JRST	ICPRDV
	JUMPN	FLAG,ICPBEG
	TTCALL	3,[ASCIZ/ (Connections in use.)/]
	EXIT
ICPCLS:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVEI	IOREG,1
	MOVEM	IOREG,WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ [Restarting]
/]
	SETO	FLAG,
	JRST	ICPRDV
ICPCLI:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ (Retrieve interrupted:  connection closed.)
/]
	JRST	ICPRDV
ICPCLO:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ (Store interrupted:  connection closed.)
/]
	JRST	ICPRDV
ICPICP:	MOVE	IOREG,DCIBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,DCOBLK+.IBDEV	;   AND COPY IT FOR DUPLEX
	MOVEM	IOREG,DCCHAS+1
	MOVE	IOREG,LOUT		; LISTEN ON OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPEOL
	MOVE	IOREG,OICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; OPEN CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,ICPBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,ICCHAS+1
	OPEN	DCCHAN,ICCHAS		; OPEN AS STANDARD DEVICE
	 JRST	ICPEF
	IN	DCCHAN,
	 JRST	.+2
	JRST	ICPET
	MOVE	IOREG,ICPBUF+1
	MOVE	IOREG,1(IOREG)		; GET THE SOCKET NUMBER
	LSH	IOREG,-4		; RIGHT JUSTIFY 32 BITS
	MOVEM	IOREG,DCOBLK+.IBRMT
	AOJ	IOREG,
	MOVEM	IOREG,DCIBLK+.IBRMT
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,OINP		; OPEN INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	MOVE	IOREG,OOUT		; OPEN OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
	OPEN	DCCHAN,DCCHAS
	 JRST	NETECF
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT
	HRRZ	IOREG,WRKBLK+.IBHST
	MOVEM	IOREG,LHOST
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
; POSITIONS IN MTAPE BLOCK

STLOC==1	; STATUS BITS RETURNED HERE
LSLOC==2	; LOCAL SOCKET
WFLOC==3	; WAIT FLAG
BSLOC==4	; BYTE SIZE LOCATION
FSLOC==5	; FOREIGN SOCKET
HLOC==6		; HOST NUMBER

ERRBTS==763600	; I/O ERROR BITS

ICPBEG:	; Tovar says this is the right thing to do - MRC
	PJOB REG2,		; GET JOB #
	MOVSS REG4,REG2		; RECEIVE SOCKET
	ADDI REG4,1		; TRANSMIT SOCKET
	MOVEI REG1,13		; SAIL'S HOST ADDRESS NUMBER
	MOVEM REG1,LHOST	; SAVE IT AWAY
	INIT DCCHAN,17
	SIXBIT /IMP/
	0
	 JRST ICPLUZ
	SETZM CONECB
	MOVEM REG2,CONECB+LSLOC
	MOVEI REG3,DCHOST
	MOVEM REG3,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI REG3,40
	MOVEM REG3,CONECB+BSLOC
	MOVEI REG3,DCSOKT
	MOVEM REG3,CONECB+FSLOC
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 2,24,0,12,12
		]		; TIME OUT CLS, RFNM, RFC, AND INPUT
	MTAPE DCCHAN,CONECB
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; NO CONNECTION TO LOGGER
	INPUT DCCHAN,[IOWD 1,FRS#
		0]
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
	MOVE REG3,FRS
	LSH REG3,-4
	MOVEM REG3,FRS
	ADDI REG3,1
	MOVEM REG3,FSS#
	ADDI REG2,2
	MOVEM REG2,LRS#
	ADDI REG4,2
	MOVEM REG4,LSS#
	MOVE REG1,CONECB+LSLOC
	MOVEM REG1,TERBLK+LSLOC
	MTAPE DCCHAN,TERBLK	; RELEASE LOGGER
	INIT DCCHAN,1
	SIXBIT /IMP/
	XWD DCOBUF,DCIBUF
	 JRST ICPLUZ
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 5,24,0,12,0
		]		; TIME OUT CLS, RFNM, AND RFC
	MOVEI REG1,↑D8
	DPB REG1,[POINT 6,DCIBUF+1,11]
	DPB REG1,[POINT 6,DCOBUF+1,11]
	MOVEM REG2,CONECB+LSLOC
	MOVEI REG3,DCHOST
	MOVEM REG3,CONECB+HLOC
	SETZM CONECB+WFLOC
	MOVEI REG3,↑D8
	MOVEM REG3,CONECB+BSLOC
	MOVE REG3,FSS
	MOVEM REG3,CONECB+FSLOC
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TRNN REG1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO RECEIVE SIDE
	CALLR CLSCHK		; SEE IF WE ARE REALLY OPEN
	 JRST ICPLUZ
	AOS CONECB+LSLOC
	SOS CONECB+FSLOC
	MOVEI REG3,↑D8
	MOVEM REG3,CONECB+BSLOC
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TRNN REG1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO SEND SIDE
	CALLR CLSCHK
	 JRST ICPLUZ
	MOVEI REG3,4
	MOVEM REG3,CONECB
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TLC REG1,300000
	TLCN REG1,300000
	 TLNE REG1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ
	SOS CONECB+LSLOC
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TLC REG1,300000
	TLCN REG1,300000
	 TLNE REG1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
	CALLR CLSCHK
	 JRST ICPLUZ
	RETURN

; HERE WHEN CONNECTION FAILS

ICPLUZ:	OUTSTR [ASCIZ/? Cannot establish network connection/]
	EXIT
>
; (((↑↑↑)))
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	MOVEI	IOREG,"Z"-100
	IDPB	IOREG,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+1
QUIT01:	INPUT	DCCHAN,
	STATZ	DCCHAN,20000
	 JRST	QUIT02
	SKIPE	FLAGDD
	 CALLR	NUTDD
	JRST	QUIT01
QUIT02:	RELEAS	DCCHAN,		; RELEASE INPUT/OUTPUT DEVICE
QUIT03:	IFE F.SAIL,<
	MOVE	IOREG,COUT		; CLOSE OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
>
QUIT04:	IFE F.SAIL,<
	MOVE	IOREG,CINP		; CLOSE INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
>
	EXIT

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
IFN F.SAIL,<
	OPEN DDCHAN,DDCHAS
	 JRST NETOI2
	SETZM CONECB
	MOVE REG1,LRS
	ADDI REG1,2
	MOVEM REG1,CONECB+LSLOC
	MOVEI REG1,DCHOST
	MOVEM REG1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI REG1,↑D36
	MOVEM REG1,CONECB+BSLOC
	MOVE REG1,FSS
	ADDI REG1,2
	MOVEM REG1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOI2
	RETURN SKIP,1
>
IFE F.SAIL,<
	SETZM	DCDBLK+.IBDEV
	MOVEI	REG1,104
	MOVEM	REG1,DCDBLK+.IBLCL
	MOVE	REG1,DCIBLK+.IBRMT
	ADDI	REG1,2
	MOVEM	REG1,DCDBLK+.IBRMT
	MOVE	REG1,ODAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
	MOVE	REG1,DCDBLK+.IBDEV
	MOVEM	REG1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
>
NETOI2:	TTCALL	3,[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
IFN F.SAIL,<
	OPEN DDCHAN,DDCHAS
	 JRST NETOO2
	SETZM CONECB
	MOVE REG1,LSS
	ADDI REG1,2
	MOVEM REG1,CONECB+LSLOC
	MOVEI REG1,DCHOST
	MOVEM REG1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI REG1,↑D36
	MOVEM REG1,CONECB+BSLOC
	MOVE REG1,FRS
	ADDI REG1,2
	MOVEM REG1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOO2
	RETURN SKIP,1
>
IFE F.SAIL,<
	SETZM	DCDBLK+.IBDEV
	MOVEI	REG1,105
	MOVEM	REG1,DCDBLK+.IBLCL
	MOVE	REG1,DCOBLK+.IBRMT
	ADDI	REG1,2
	MOVEM	REG1,DCDBLK+.IBRMT
	MOVE	REG1,ODAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
	MOVE	REG1,DCDBLK+.IBDEV
	MOVEM	REG1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
>
NETOO2:	TTCALL	3,[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	RELEAS	DDCHAN,
IFE F.SAIL,<
	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETC1
	RETURN
NETC1:	TTCALL	3,[ASCIZ / ?? Network connection CLOSE failure ??
/]
>
	ENDR

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
IFN F.SAIL,<MOVE UTIL,LRS
	ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,104>
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
IFN F.SAIL,<MOVE UTIL,LSS
	ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,105>
	ENDR

; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETO	REG1,
	CAMN	REG1,FSBUF
	 JRST	NETFI0
	CAMN	REG1,ESBUF
	 JRST	NETFI0
	JRST	NETFI1
NETFI0:	TTCALL	3,[ASCIZ/ (/]
	TTCALL	3,LUTDSF
	TTCALL	3,[ASCIZ/)
/]
NETFI1:	SKIPN	GBUF1
	 JRST	NETFI2
	MOVE	REG1,[point 6,LFILE]
	MOVEI	REG2,6
	MOVE	REG3,[point 7,FBUF]
	ILDB	REG4,REG1
	SKIPE	REG4
	 ADDI	REG4,40
	IDPB	REG4,REG3
	SOJG	REG2,.-4
NETFI2:	SKIPN	GBUF2
	 RETURN
	MOVE	REG1,[point 6,LFILE+1]
	MOVEI	REG2,3
	MOVE	REG3,[point 7,EBUF]
	ILDB	REG4,REG1
	SKIPE	REG4
	 ADDI	REG4,40
	IDPB	REG4,REG3
	SOJG	REG2,.-4
	ENDR

; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 JRST	.+2
	JRST	NETEIT
	SKIPE	FLAGDD
	 CALLR NUTDD
	ENDR

; NETWORK UTILITY -- MESSAGE OUTPUT
;   IN: REG1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO:	BEGINR	<IOREG,BPREG>
	SKIPE FLAGDD
	 OUTSTR (REG1)
	MOVEI	BPREG,(REG1)
	HRLI	BPREG,(point 7,)
NUTMOL:	ILDB	IOREG,BPREG
	JUMPE	IOREG,RETN(0)
	SKIPE	DCOBUF+2
	 JRST	NUTMOB
NUTMOO:	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
NUTMOB:	SOS	DCOBUF+2
	IDPB	IOREG,DCOBUF+1
	JRST	NUTMOL
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD:	BEGINR	<IOREG,UTIL>
	MOVE REG1,DCIBUF+1
	MOVE UTIL,DCIBUF+2
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IOREG,REG1
	JUMPE	IOREG,NUTDDL
	TTCALL	1,IOREG
	JRST	NUTDDL
	ENDR

; NETWORK UTILITY -- FILL A DESIGNATED BUFFER
;   IN: IOREG -- SIZE OF BUFFER (- IF EOF POSSIBLE),,ADDRESS OF BUFFER
;
NUTFB:	BEGINR
	HLRE	REG1,IOREG
	SKIPGE	REG1
	 MOVN	REG1,REG1
	HRRZI	REG2,(IOREG)
	SKIPE	DDIBUF+2
	 JRST	NUTFB2
NUTFB1:	IN	DDCHAN,
	 JRST	NUTFB2
	SKIPL	IOREG
	 THUD
	STATO	DDCHAN,020000
	 THUD
	RETURN
NUTFB2:	HRRZ	REG3,DDIBUF+1
	HRLI	REG2,1(REG3)
	MOVEI	REG3,(REG1)
	CAMLE	REG3,DDIBUF+2
	 MOVE	REG3,DDIBUF+2
	ADDI	REG3,-1(REG2)
	BLT	REG2,(REG3)
	CAMG	REG1,DDIBUF+2
	 JRST	NUTFB3
	SUB	REG1,DDIBUF+2
	MOVEI	REG2,1(REG3)
	JRST	NUTFB1
NUTFB3:	ADDM	REG1,DDIBUF+1
	MOVE	REG2,DDIBUF+2
	SUBI	REG2,(REG1)
	MOVEM	REG2,DDIBUF+2
	SKIPL	IOREG
	 RETURN
	ENDR	SKIP,1

; FATAL NETWORK ERROR MESSAGES
;
; (((NOT SAIL)))
IFE F.SAIL,<
ICPERD:	TTCALL	3,[ASCIZ / ?? Restart failure ??/]
	EXIT
ICPEIL:	TTCALL	3,[ASCIZ / ?? Input socket listen failure ??/]
	EXIT
ICPEOL:	TTCALL	3,[ASCIZ / ?? Output socket listen failure ??/]
	JRST	QUIT04
ICPET:	TTCALL	3,[ASCIZ / ?? ICP failure (transfer) ??/]
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
ICPEZ:	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	JRST	QUIT03
ICPEF:	TTCALL	3,[ASCIZ / ?? ICP failure (file control) ??/]
	JRST	ICPEZ
ICPEC:	TTCALL	3,[ASCIZ / The datacomputer is unavailable/]
	MOVE	0,ICPBLK+.IBERR
	CAIN	0,.IESOF	; SOCKET OPEN FAILURE
	 TTCALL	3,[ASCIZ / (rejecting)/]
	CAIN	0,.IEDWN
	 TTCALL	3,[ASCIZ / (down)/]
	CAIN	0,.IETIM
	 TTCALL	3,[ASCIZ / (timeout)/]
	TTCALL	3,[ASCIZ /.
/]
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT03
	JRST	QUIT03
NETEIC:	TTCALL	3,[ASCIZ / ?? Input failure (connection) ??/]
	EXIT
NETEOC:	TTCALL	3,[ASCIZ / ?? Output failure (connection) ??/]
	JRST	QUIT04
NETECF:	TTCALL	3,[ASCIZ / ?? File control failure ??/]
	JRST	QUIT03
>
; (((↑↑↑)))
NETEIT:	TTCALL	3,[ASCIZ / ?? Input failure (transfer) ??/]
	JRST	QUIT
NETEOT:	TTCALL	3,[ASCIZ / ?? Output failure (transfer) ??/]
	JRST	QUIT

; (((SAIL)))
IFE F.SAIL,<
OICP:	.IUCON,,ICPBLK
CICP:	.IUCLS,,ICPBLK
LINP:	.IULSN,,DCIBLK
OINP:	.IUCON,,DCIBLK
CINP:	.IUCLS,,DCIBLK
LOUT:	.IULSN,,DCOBLK
OOUT:	.IUCON,,DCOBLK
COUT:	.IUCLS,,DCOBLK
ODAT:	001000+.IUCON,,DCDBLK	; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT:	.IUCLS,,DCDBLK
PWRK:	.IULHS,,WRKBLK
SWRK:	.IUSTT,,WRKBLK
CWRK:	.IUCLS,,WRKBLK
>
; (((↑↑↑)))

;(((SAIL)))
IFN F.SAIL,< 
; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME

CLSCHK:	BEGINR
	MTAPE DCCHAN,STTBLK
	MOVE REG1,STTBLK+1
	IOR REG1,STTBLK+2
	STATO DCCHAN,ERRBTS
	TLNN REG1,060000
	 RETURN SKIP,1
	ENDR
>
;(((↑↑↑↑)))

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOI1
	SETZM LFILE+3		; JUST GUESS WHAT A NEGATIVE NUMBER
				; WITH SIZE DOES ON SAIL WITH SIXBIT
				; PPN'S!!!(YOU GUESSED IT...)
	LOOKUP	LFCHAN,LFILE	; PREPARE FILE FOR INPUT
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	TTCALL	3,[ASCIZ / ?? Local channel OPEN failure ??
/]
	RELEAS	LFCHAN,
	RETURN
LOCOI2:	TTCALL	3,[ASCIZ / (Local file not found.)
/]
	RELEAS	LFCHAN,
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR	<IOREG,<IOREG+1>>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS
	 JRST	LOCOO2
	MOVE	IOREG,<LFILE+1>
	MOVE	<IOREG+1>,<LFILE+2>
	SETZM LFILE+3
	LOOKUP	LFCHAN,LFILE
	 JRST	LOCOO1
	TAIN	<[ASCIZ / [Old Local File][Confirm]/]>
	 JRST	.+3
	 JRST	.+2
	JRST	LOCOO1
	RELEAS	LFCHAN,
	RETURN
LOCOO1:	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOO2
	MOVEM	IOREG,<LFILE+1>
	MOVEM	<IOREG+1>,<LFILE+2>
	SETZM LFILE+3
	ENTER	LFCHAN,LFILE	; PREPARE FILE FOR OUTPUT
	 JRST	LOCOO2
	RETURN	SKIP,1
LOCOO2:	TTCALL	3,[ASCIZ / ?? Local file creation failure ??
/]
	RELEAS	LFCHAN,
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	RELEAS	LFCHAN,
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IOREG -- SIZE IN WORDS
;
LOCS:	BEGINR
	SKIPL	LFILE+3
	 JRST	LOCS1
	HLRO	IOREG,LFILE+3	; SIZE IN WORDS
	MOVN	IOREG,IOREG
	RETURN
LOCS1:	HLRZ	IOREG,LFILE+3	; SIZE IN BLOCKS
	IMULI	IOREG,SIZBLK
	ENDR

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR	<IOREG>
	SETZM	GBUF1
	LDB	REG1,[350700,,FBUF]
	CAIN	REG1,"*"
	 SETOM	GBUF1
	SETZM	GBUF2
	LDB	REG1,[350700,,EBUF]
	CAIN	REG1,"*"
	 SETOM	GBUF2
	SETO	REG1,
	CAMN	REG1,FSBUF
	 JRST	LOCFI0
	CAMN	REG1,ESBUF
	 JRST	LOCFI0
	JRST	LOCFI5
LOCFI0:	SETZM	LUTDSP
LOCFI1:	CALLR	LUTDS
	 JRST	.+2
	JRST	.+3
	TTCALL	3,[ASCIZ/ (No Such File)
/]
	RETURN
	SETO	REG1,
	CAME	REG1,FSBUF
	 JRST	LOCFI2
	CAME	REG1,ESBUF
	 JRST	LOCFI3
	JRST	LOCFI4
LOCFI2:	MOVE	REG1,[point 7,FSBUF]
	MOVE	REG2,[point 7,LUTDSF]
	ILDB	REG3,REG1
	ILDB	REG4,REG2
	JUMPE	REG3,.+4
	CAIN	REG3,(REG4)
	 JRST	.-4
	JRST	LOCFI1
	JUMPE	REG4,LOCFI4
	CAIN	REG4,"."
	 JRST	LOCFI4
	JRST	LOCFI1
LOCFI3:	MOVE	REG1,[point 7,ESBUF]
	MOVE	REG2,[point 7,LUTDSF]
	ILDB	REG4,REG2
	JUMPE	REG4,.+4
	CAIE	REG4,"."
	 JRST	.-3
	ILDB	REG4,REG2
	ILDB	REG3,REG1
	JUMPE	REG3,.+4
	CAIN	REG3,(REG4)
	 JRST	.-4
	JRST	LOCFI1
	JUMPE	REG4,LOCFI4
	JRST	LOCFI1
LOCFI4:	HRRZI	IOREG,LUTDSF
	CALLR	LUTFN
LOCFI5:	CALLR	LOCOI
	 RETURN
	CALLR	LOCC
	ENDR	SKIP,1

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR	<IOREG>
	CALLR	LOCC
	SETO	REG1,
	CAMN	REG1,FSBUF
	 JRST	LOCNI0
	CAMN	REG1,ESBUF
	 JRST	LOCNI0
	RETURN	SKIP,1
LOCNI0:	CALLR	LUTDS
	 RETURN	SKIP,1
	SETO	REG1,
	CAME	REG1,FSBUF
	 JRST	LOCNI1
	CAME	REG1,ESBUF
	 JRST	LOCNI2
	JRST	LOCNI3
LOCNI1:	MOVE	REG1,[point 7,FSBUF]
	MOVE	REG2,[point 7,LUTDSF]
	ILDB	REG3,REG1
	ILDB	REG4,REG2
	JUMPE	REG3,.+4
	CAIN	REG3,(REG4)
	 JRST	.-4
	JRST	LOCNI0
	JUMPE	REG4,LOCNI3
	CAIN	REG4,"."
	 JRST	LOCNI3
	JRST	LOCNI0
LOCNI2:	MOVE	REG1,[point 7,ESBUF]
	MOVE	REG2,[point 7,LUTDSF]
	ILDB	REG4,REG2
	JUMPE	REG4,.+4
	CAIE	REG4,"."
	 JRST	.-3
	ILDB	REG4,REG2
	ILDB	REG3,REG1
	JUMPE	REG3,.+4
	CAIN	REG3,(REG4)
	 JRST	.-4
	JRST	LOCNI0
	JUMPE	REG4,LOCNI3
	JRST	LOCNI0
LOCNI3:	HRRZI	IOREG,LUTDSF
	CALLR	LUTFN
	CALLR	LOCOI
	 JRST LOCNI0
	TTCALL	3,[ASCIZ/ (/]
	TTCALL	3,LUTDSF
	TTCALL	3,[ASCIZ/)
/]
	SKIPN	GBUF1
	 JRST	LOCNI4
	MOVE	REG1,[point 6,LFILE]
	MOVEI	REG2,6
	MOVE	REG3,[point 7,FBUF]
	ILDB	REG4,REG1
	SKIPE	REG4
	 ADDI	REG4,40
	IDPB	REG4,REG3
	SOJG	REG2,.-4
LOCNI4:	SKIPN	GBUF2
	 RETURN
	MOVE	REG1,[point 6,LFILE+1]
	MOVEI	REG2,3
	MOVE	REG3,[point 7,EBUF]
	ILDB	REG4,REG1
	SKIPE	REG4
	 ADDI	REG4,40
	IDPB	REG4,REG3
	SOJG	REG2,.-4
	ENDR

; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR	<IOREG>
	SETZ	REG1,
	SETO	REG2,
	CAMN	REG2,FSBUF
	 TRO	REG1,400000
	CAMN	REG2,ESBUF
	 TRO	REG1,200000
	JUMPE	REG1,RETN(0)
	MOVE	REG2,[point 7,ABUF]
	MOVE	REG3,[point 7,FSBUF]
	TRNE	REG1,400000
	 HRRI	REG3,FBUF
	ILDB	REG4,REG3
	CAIN	REG4," "
	 SETZ	REG4,
	IDPB	REG4,REG2
	JUMPN	REG4,.-4
	SKIPN	ESBUF
	 JRST	LOCNO0
	MOVEI	REG4,"."
	DPB	REG4,REG2
	MOVE	REG3,[point 7,ESBUF]
	TRNE	REG1,200000
	 HRRI	REG3,EBUF
	ILDB	REG4,REG3
	CAIN	REG4," "
	 SETZ	REG4,
	IDPB	REG4,REG2
	JUMPN	REG4,.-4
LOCNO0:	MOVEI	IOREG,ABUF
	CALLR	LUTFN
	TTCALL	3,[ASCIZ/ (/]
	TTCALL	3,ABUF
	TTCALL	3,[ASCIZ/)
/]
	ENDR

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR	<IOREG,BPREG,UTIL>
	HRRI	BPREG,(IOREG)
	HRLI	BPREG,(point 7,)
	SETZM	LFILE		; CLEAR OLD FILE NAME
	SETZM	LFILE+1		;   AND EXTENSION
	SETZM	LFILE+2
	SETZM	LFILE+3
	MOVEI	REG1,LUTFNT	; INITIALIZE XCT PNTR
	MOVEI	REG2,LFILE	; SET DESTINATION OF IOR
	SETZ	UTIL,
LUTFN1:	ILDB	IOREG,BPREG
	JUMPE	IOREG,RETN(0)
	CAIN	IOREG,"."	; PREPARE FOR FILE EXTENSION IF "."
	 JRST	LUTFN2
	CAILE	UTIL,5
	 JRST	LUTFN1
	ADDI	IOREG,40	; CONVERT TO SIXBIT BY ADDITION
	ANDI	IOREG,77	;   AND REMOVAL OF HIGH BITS
	XCT	(REG1)		; EXECUTE THE PROPER ROTATE
	IORM	IOREG,(REG2)	; IOR RESULT INTO FILE OR FILE+1
	AOJ	REG1,		; INCREMENT THE XCT PNTR
	AOJA	UTIL,LUTFN1
LUTFN2:	CAIN	REG2,LFILE+1
	 JRST	RETN(0)		; IGNORE MULTIPLE EXTENSIONS
	MOVEI	REG1,LUTFNT	; RESET PNTRS FOR EXTENSION
	MOVEI	REG2,LFILE+1
	MOVEI	UTIL,3
	JRST	LUTFN1
LUTFNT:	ROT	IOREG,-6	; HIGH ORDER
	ROT	IOREG,-14
	ROT	IOREG,22
	ROT	IOREG,14
	ROT	IOREG,6
	ROT	IOREG,0		; LOW ORDER
	ENDR

; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS:	BEGINR
	SKIPN	LUTDSP
	 JRST	LUTDSS
LUTDS1:	JSP REG1,LUTDSI
	JUMPE REG2,[	JSP REG1,LUTDSI
			; (((SAIL)))
			IFN F.SAIL,<
			REPEAT ↑D14,<JSP REG1,LUTDSI>
			>
			; (((↑↑↑)))
			JRST LUTDS1]	; IGNORE HOLES IN DIRECTORY
	MOVE REG3,[POINT 7,LUTDSF]
LUTDS2:	SETZ REG1,
	LSHC REG1,6
	ADDI REG1," "
	IDPB REG1,REG3
	JUMPN REG2,LUTDS2
	MOVEI REG1,"."
	IDPB REG1,REG3
	JSP REG1,LUTDSI
	ANDCMI REG2,-1
LUTDS3:	SETZ REG1,
	LSHC REG1,6
	ADDI REG1," "
	IDPB REG1,REG3
	JUMPN REG2,LUTDS3
	SETZ REG1,
	IDPB REG1,REG3
; (((SAIL)))
IFN F.SAIL,<
REPEAT ↑D14,<JSP REG1,LUTDSI>		;IGNORE EXTRA SAIL UFD CRUFT
>
; (((↑↑↑)))
	RETURN	SKIP,1
LUTDSI:	SOSG LDIBUF+2
	 IN LDCHAN,
	  CAIA
	   JRST LUTDSD
	ILDB REG2,LDIBUF+1
	JRST (REG1)
LUTDSS:	RELEAS	LDCHAN,
	GETPPN	REG1,
	MOVEM	REG1,LDIR
	MOVE	REG1,[SIXBIT/UFD/]
	MOVEM	REG1,LDIR+1
	SETZM	LDIR+2
IFE F.SAIL,<MOVE REG1,[1,,1]>
IFN F.SAIL,<MOVE REG1,[SIXBIT/  1  1/]>
	MOVEM	REG1,LDIR+3
	OPEN	LDCHAN,LDCHAS
	 JRST	LUTDSE
	LOOKUP	LDCHAN,LDIR
	 JRST	LUTDSE
	SETOM LUTDSP
	JRST LUTDS1
LUTDSD:	STATO	LDCHAN,20000
LUTDSE:	 TTCALL	3,[ASCIZ/ ?? LOCAL DIRECTORY FAILURE ??
/]
	RELEAS	LDCHAN,
	ENDR

; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN: IOREG -- DATE INTEGER
;	UTIL -- TIME INTEGER
;	BPREG -- BYTE POINTER TO DESTINATION STRING
;   OUT: BPREG -- UPDATED BYTE POINTER
;
LUTTNS:	BEGINR
	MOVE	REG1,IOREG
	IDIVI	REG1,↑D31
	MOVEI	REG3,(REG1)
	MOVEI	REG1,1(REG2)
	IDIVI	REG1,↑D10
	ADDI	REG1,"0"
	ADDI	REG2,"0"
	IDPB	REG1,BPREG
	IDPB	REG2,BPREG
	MOVEI	REG1,"-"
	IDPB	REG1,BPREG
	MOVEI	REG1,(REG3)
	IDIVI	REG1,↑D12
	MOVEI	REG3,(REG1)
	HRRI	REG1,LUTTM(REG2)
	HRLI	REG1,(point 7,)
	SCOPY	(REG1,BPREG)
	MOVEI	REG1,"-"
	IDPB	REG1,BPREG
	MOVEI	REG1,↑D64(REG3)
	IDIVI	REG1,↑D10
	ADDI	REG1,"0"
	ADDI	REG2,"0"
	IDPB	REG1,BPREG
	IDPB	REG2,BPREG
	MOVEI	REG1," "
	IDPB	REG1,BPREG
	MOVE	REG1,UTIL
	IDIVI	REG1,↑D60
	MOVEI	REG3,(REG2)
	IDIVI	REG1,↑D10
	ADDI	REG1,"0"
	ADDI	REG2,"0"
	IDPB	REG1,BPREG
	IDPB	REG2,BPREG
	MOVEI	REG1,":"
	IDPB	REG1,BPREG
	MOVEI	REG1,(REG3)
	IDIVI	REG1,↑D10
	ADDI	REG1,"0"
	ADDI	REG2,"0"
	IDPB	REG1,BPREG
	IDPB	REG2,BPREG
	SETZ	REG1,
	IDPB	REG1,BPREG
	ENDR

; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IOREG -- ADDRESS OF TIME STRING
;   OUT: IOREG -- DATE INTEGER
;	 UTIL -- TIME INTEGER
;
LUTTSN:	BEGINR	<BPREG>
	MOVE	BPREG,IOREG
	SETZ	IOREG,
	SETZ	UTIL,
	ILDB	REG1,BPREG
	CAIL	REG1,"0"
	 CAILE	REG1,"9"
	  RETURN
	MOVEI	REG4,-"0"(REG1)
	IMULI	REG4,↑D10
	ILDB	REG1,BPREG
	ADDI	REG4,-"0"(REG1)
	ILDB	REG1,BPREG
	CAIE	REG1,"-"
	 RETURN
	MOVE	REG3,[point 7,REG2]
	SETZ	REG2,
	ILDB	REG1,BPREG
	IDPB	REG1,REG3
	ILDB	REG1,BPREG
	IDPB	REG1,REG3
	ILDB	REG1,BPREG
	IDPB	REG1,REG3
	MOVEI	REG3,↑D11
	CAMN	REG2,LUTTM(REG3)
	 JRST	.+3
	SOJGE	REG3,.-2
	RETURN
	ILDB	REG1,BPREG
	CAIE	REG1,"-"
	 RETURN
	ILDB	REG1,BPREG
	MOVEI	REG2,-"0"(REG1)
	IMULI	REG2,↑D10
	ILDB	REG1,BPREG
	ADDI	REG2,-"0"(REG1)
	SUBI	REG2,↑D64
	IMULI	REG2,↑D12
	ADDI	REG2,(REG3)
	IMULI	REG2,↑D31
	ADDI	REG2,-1(REG4)
	ILDB	REG1,BPREG
	CAIE	REG1," "
	 RETURN
	ILDB	REG1,BPREG
	MOVEI	REG3,-"0"(REG1)
	IMULI	REG3,↑D10
	ILDB	REG1,BPREG
	ADDI	REG3,-"0"(REG1)
	IMULI	REG3,6
	ILDB	REG1,BPREG
	CAIE	REG1,":"
	 RETURN
	ILDB	REG1,BPREG
	ADDI	REG3,-"0"(REG1)
	IMULI	REG3,↑D10
	ILDB	REG1,BPREG
	ADDI	REG3,-"0"(REG1)
	MOVE	IOREG,REG2
	MOVE	UTIL,REG3
	ENDR

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII	/JAN/
	ASCII	/FEB/
	ASCII	/MAR/
	ASCII	/APR/
	ASCII	/MAY/
	ASCII	/JUN/
	ASCII	/JUL/
	ASCII	/AUG/
	ASCII	/SEP/
	ASCII	/OCT/
	ASCII	/NOV/
	ASCII	/DEC/

; OOPS -- THE IMPOSSIBLE HAS HAPPENED
;
OOPS:	MOVE	IOREG,[IN DDCHAN,]
	CAMN	IOREG,-3(FLAG)
	 JRST	IOERDD
	MOVE	IOREG,[OUT DDCHAN,]
	CAMN	IOREG,-3(FLAG)
	 JRST	IOERDD
	MOVE	IOREG,[IN LFCHAN,]
	CAMN	IOREG,-3(FLAG)
	 JRST	IOERLF
	MOVE	IOREG,[OUT LFCHAN,]
	CAMN	IOREG,-3(FLAG)
	 JRST	IOERLF
	TTCALL	3,[ASCIZ/ ?? Impossible event at /]
	MOVEI	IOREG,-1(FLAG)
	TNOUT	(IOREG,10)
	TTCALL	3,[ASCIZ / ??/]
	EXIT
IOERDD:	GETSTS	DDCHAN,ABUF
	JRST	.+2
IOERLF:	GETSTS	LFCHAN,ABUF
	TTCALL	3,[ASCIZ/ ?? Data error at /]
	MOVEI	IOREG,-3(FLAG)
	TNOUT	(IOREG,10)
	TTCALL	3,[ASCIZ/ with status /]
	MOVE	IOREG,ABUF
	TNOUT	(IOREG,10)
	TTCALL	3,[ASCIZ / ??
/]
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	JRST	QUIT
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	REG1,[SIXBIT/DFTP/]
	SETNM
	HRRZI	REG1,-1
	RFMOD
	TRZ	REG2,006000	; (1B24+1B25)
	SFMOD
	MOVE	REG2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
	MOVE	REG3,[252525,,253000] ;   AND EOL'S (NO NULLS)
	SFCOC
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[LEVTAB,,CHNTAB]
	SIR			; SET UP INTERRUPT TABLES
	EIR			; ENABLE INTERRUPTS
	MOVE	REG1,[17,,0]	; ↑O ON CHANNEL 0
	ATI
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[1B0+1B10+1B11+1B15] ; TTY, EOF, DATA ERROR, ILI
	AIC			; ACTIVATE CHANNELS
	SETZM	FLAGCO
	SETZM	FLAGEF
	CALLR	ICP
	ENDR

; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR	<BPREG,UTIL>
	MOVEI	REG1,400000
	RUNTM
	IDIV	REG3,REG2
	MOVEM	REG3,NTIME
	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,FBUF]
	MOVNI	REG3,GET$F
	SETOM	FLAGEF
	SIN
	SKIPN	FLAGEF
	 RETURN
	SETZM	FLAGEF
	MOVEI	BPREG,GET$F
	MOVEM	BPREG,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(BPREG)
	SOJG	BPREG,.-1
	ADDM	UTIL,NSUM
	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,EBUF]
	MOVNI	REG3,GET$E
	SIN
	MOVEI	BPREG,GET$E
	ADDM	BPREG,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(BPREG)
	SOJG	BPREG,.-1
	ADDM	UTIL,NSUM
	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,GET$D
	SIN
	MOVEI	BPREG,GET$D
	ADDM	BPREG,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<PAGE-1>(BPREG)
	SOJG	BPREG,.-1
	ADDM	UTIL,NSUM
	MOVE	REG1,[point 7,PAGE]
	SETZ	REG2,
	IDTIM
	 SETZ	REG2,
	MOVEM	REG2,ABUF
	MOVE	REG1,DCDJFN
	BIN
	AOS	NSIZE
	ADDM	REG2,NSUM
	MOVEM	REG2,<ABUF+1>
	BIN
	AOS	NSIZE
	ADDM	REG2,NSUM
	MOVEM	REG2,<ABUF+2>
	ENDR	SKIP,1

; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR	<IOREG,BPREG,UTIL>
	SETZ	UTIL,
	MOVE	REG1,DCDJFN
	BIN
	ADDM	REG2,NSUM
	MOVN	IOREG,REG2
	ADDI	REG2,3
	ADDM	REG2,NSIZE
	JUMPE	IOREG,GETD2
GETD1:	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	CAMGE	REG3,IOREG
	 MOVE	REG3,IOREG
	SIN
	HRRZ	REG1,LJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	CAMGE	REG3,IOREG
	 MOVE	REG3,IOREG
	SOUT
	MOVN	BPREG,IOREG
	CAILE	BPREG,SIZPAG
	 MOVEI	BPREG,SIZPAG
	ADD	UTIL,<PAGE-1>(BPREG)
	SOJG	BPREG,.-1
	ADDI	IOREG,SIZPAG
	JUMPL	IOREG,GETD1
GETD2:	MOVE	REG1,DCDJFN
	BIN
	ADD	UTIL,REG2
	ADDM	UTIL,NSUM
	BIN
	ADDM	REG2,NSUM
	CAMN	REG2,UTIL
	 JRST	GETD3
	TSOUT	<[ASCIZ/ (File Checksum Error.)/],CRLF>
GETD3:	HRROI	REG1,LFILE
	HRRZ	REG2,LJFN
	MOVE	REG3,[022220,,000001]
	JFNS
	CALLR	LOCC
	SETO	REG1,
	CAMN	REG1,FSBUF
	 JRST	GETD4
	CAMN	REG1,ESBUF
	 JRST	GETD4
	CAMN	REG1,VSBUF
	 JRST	GETD4
	JRST	GETD5
GETD4:	HRROI	REG1,[ASCIZ/  /]
	PSOUT
	HRROI	REG1,LFILE
	PSOUT
	HRROI	REG1,CRLF
	PSOUT
GETD5:	CALLR	LOCOI
	 THUD
	MOVE	REG3,<ABUF+2>
	JUMPLE	REG3,GETD6
	HRR	REG1,LJFN
	HRLI	REG1,11		; OFFSET 11
	HRLZI	REG2,007700	; BYTESIZE (B6-B11)
	LSH	REG3,30
	CHFDB
	HRR	REG1,LJFN
	HRLI	REG1,12		; OFFSET 12 (BYTE COUNT)
	SETO	REG2,
	MOVE	REG3,<ABUF+1>
	CHFDB
GETD6:	SKIPN	ABUF
	 JRST	GETD7
	MOVEI	REG1,400000
	RPCAP
	TRNN	REG2,600000	; (1B18+1B19) WHEEL OR OPER
	 JRST	GETD7
	MOVE	UTIL,REG3
	TRO	REG3,(REG2)
	EPCAP			; ENABLE (!)
	HRR	REG1,LJFN
	HRLI	REG1,14		; OFFSET 14 (LAST WRITE)
	SETO	REG2,
	MOVE	REG3,ABUF
	CHFDB
	MOVEI	REG1,400000
	MOVE	REG3,UTIL
	EPCAP			; RESET CAPABILITIES
GETD7:	MOVEI	REG1,400000
	RUNTM
	IDIV	REG3,REG2
	MOVE	REG2,NTIME
	SUB	REG3,REG2
	MOVEM	REG3,NTIME
	ENDR

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR	<BPREG,UTIL>
	MOVEI	REG1,400000
	RUNTM
	IDIV	REG3,REG2
	MOVEM	REG3,NTIME
	MOVE	BPREG,[point 7,PAGE]
	MOVE	UTIL,[point 7,FBUF]
	SCOPY	(UTIL,BPREG)
	MOVE	BPREG,UTIL
	MOVE	UTIL,[point 7,EBUF]
	SCOPY	(UTIL,BPREG)
	MOVE	BPREG,UTIL
	HRRZ	REG1,LJFN
	MOVE	REG2,[1,,14]	; 1 WORD, OFFSET 14 (LAST WRITE)
	HRRZI	REG3,UBUF1
	GTFDB
	 JRST	PUTF1
	SETZ	REG1,
	IDPB	REG1,BPREG
	JRST	PUTF2
PUTF1:	MOVE	REG1,BPREG
	MOVE	REG2,UBUF1
	SETZ	REG3,
	ODTIM
	IBP	REG1
	MOVE	BPREG,REG1
PUTF2:	GTAD
	MOVE	REG2,REG1
	MOVE	REG1,BPREG
	ODTIM
	IBP	REG1
	MOVEI	BPREG,(REG1)
	MOVE	UTIL,VBUF
	MOVEM	UTIL,1(BPREG)
	ADDI	BPREG,1
	HRRZ	REG1,LJFN
	MOVE	REG2,[2,,11]	; 2 WORDS, OFFSET 11 (BYTESIZE & COUNT)
	HRRZI	REG3,UBUF1
	GTFDB
	 JRST	PUTF3
	SETZM	UBUF1
	SETZM	<UBUF1+1>
PUTF3:	MOVE	UTIL,<UBUF1+1>
	MOVEM	UTIL,1(BPREG)
	LDB	UTIL,[300600,,UBUF1]
	MOVEM	UTIL,2(BPREG)
	ADDI	BPREG,2
	MOVEI	UTIL,1(BPREG)
	SUBI	UTIL,PAGE
	MOVEM	UTIL,NSIZE
	MOVEI	BPREG,-1(UTIL)
	SETZ	UTIL,
	ADD	UTIL,PAGE(BPREG)
	SOJGE	BPREG,.-1
	ADDM	UTIL,NSUM
	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,PAGE]
	MOVN	REG3,NSIZE
	SOUT
	ENDR

; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR	<IOREG,BPREG,UTIL>
	CALLR	LOCS
	MOVE	REG1,DCDJFN
	MOVE	REG2,IOREG
	BOUT
	ADDM	REG2,NSUM
	ADDI	REG2,2
	ADDM	REG2,NSIZE
	MOVN	IOREG,IOREG
	SETZ	UTIL,
	JUMPE	IOREG,PUTD2
PUTD1:	HRRZ	REG1,LJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	CAMGE	REG3,IOREG
	 MOVE	REG3,IOREG
	SIN
	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	CAMGE	REG3,IOREG
	 MOVE	REG3,IOREG
	SOUT
	MOVN	BPREG,IOREG
	CAILE	BPREG,SIZPAG
	 MOVEI	BPREG,SIZPAG
	ADD	UTIL,<PAGE-1>(BPREG)
	SOJG	BPREG,.-1
	ADDI	IOREG,SIZPAG
	JUMPL	IOREG,PUTD1
PUTD2:	MOVE	REG1,DCDJFN
	MOVE	REG2,UTIL
	BOUT
	ADDM	UTIL,NSUM
	ADDM	UTIL,NSUM
	MOVEI	REG2,21
	MTOPR
	MOVEI	REG1,400000
	RUNTM
	IDIV	REG3,REG2
	MOVE	REG2,NTIME
	SUB	REG3,REG2
	MOVEM	REG3,NTIME
	ENDR

; TENEX ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKETS
;				A) EVEN - INPUT
;				B) ODD - OUTPUT
; JFN STRING:	"NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP:	BEGINR
	MOVE	REG1,[point 7,UBUF1]
	HRROI	REG2,[ASCIZ/NET:20./]
	SETZ	REG3,
	SOUT			; LOCAL SOCKET 20+JOBREL
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT			; FAILURE -- MAKE HOST # INTO STRING
	 JRST	.+1		; CVHST SUCCESS OR NOUT FAILURE
	MOVN	REG2,DCSOCK
	NOUT
	 JRST	.+1
	HRLZI	REG1,1	; SHORT GTJFN
	HRROI	REG2,UBUF1
	GTJFN			; ICP CONNECTION
	 JRST	ICPEG
	MOVE	REG2,[40B5+1B19] ; 32-BIT, READ
	OPENF			; OPEN ICP CONNECTION
	 JRST	ICPEO
	BIN
	MOVEM	REG2,ICPSOC
	CLOSF
	 JRST	ICPEC
	MOVE	REG1,[point 7,UBUF1]
	HRROI	REG2,[ASCIZ/NET:22./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN			; OUTPUT JFN
	 JRST	ICPEIG
	MOVEM	REG1,DCOJFN
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN			; INPUT JFN
	 JRST	ICPEOG
	MOVEM	REG1,DCIJFN
	MOVE	REG2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
	OPENF
	 JRST	ICPEIO
	MOVE	REG1,DCOJFN
	MOVE	REG2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	ICPEOO
	MOVE	REG1,[SIXBIT/LHOSTN/]
	SYSGT
	MOVEM	REG1,LHOST
	ENDR

; NETWORK QUIT
;
QUIT:	MOVE	REG1,DCOJFN
	MOVEI	REG2,"Z"-100
	BOUT
	MOVEI	REG2,21
	MTOPR
	SETOM	FLAGEF
QUIT01:	DCBIN	<IOREG>
	SKIPE	FLAGEF
	 JRST	QUIT01
	RESET
	HALTF
	JRST	.-1		; IN CASE OF "CONTINUE"

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	MOVE	REG1,[point 7,UBUF1]
	HRROI	REG2,[ASCIZ/NET:24./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	SUBI	REG2,3
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN
	 JRST	NETOI2
	MOVEM	REG1,DCDJFN
	MOVE	REG2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
	OPENF
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	RLJFN
	 JRST	NETOI2
NETOI2:	HRROI	REG1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	MOVE	REG1,[point 7,UBUF1]
	HRROI	REG2,[ASCIZ/NET:25./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	SUBI	REG2,2
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN
	 JRST	NETOO2
	MOVEM	REG1,DCDJFN
	MOVE	REG2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	RLJFN
	 JRST	NETOO2
NETOO2:	HRROI	REG1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	MOVE	REG1,DCDJFN
	CLOSF
	 JRST	NETC1
	RETURN
NETC1:	HRROI	[ASCIZ/ ?? Network connection CLOSE failure ??
/]
	PSOUT
	ENDR

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
	GJINF
	HRRZI	UTIL,(REG2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,24
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
	GJINF
	HRRZI	UTIL,(REG2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,25
	ENDR

; NETFFI -- NETWORK FIX FIRST FILE NAME
;
NETFFI:	BEGINR
	MOVE	REG2,LJFN
	TLNN	REG2,770000
	 JRST	NETFI1
	HRROI	REG1,LFILE
	HRRZI	REG2,(REG2)
	SETZ	REG3,
	JFNS
	HRROI	REG1,[ASCIZ/  /]
	PSOUT
	HRROI	REG1,LFILE
	PSOUT
	HRROI	REG1,CRLF
	PSOUT
NETFI1:	SKIPN	GBUF1
	 JRST	NETFI2
	HRROI	REG1,FBUF
	HRRZ	REG2,LJFN
	HRLZI	REG3,002000
	JFNS
NETFI2:	SKIPN	GBUF2
	 JRST	NETFI3
	HRROI	REG1,EBUF
	HRRZ	REG2,LJFN
	HRLZI	REG3,000200
	JFNS
NETFI3:	SKIPL	VSBUF
	 RETURN
	MOVN	REG1,VBUF
	MOVEM	REG1,VSBUF
	ENDR

; FATAL NETWORK ERROR MESSAGES
;
NETEQ:	PSOUT
	RESET
	HALTF
	JRST	.-1
ICPEG:	HRROI	REG1,[ASCIZ/ The datacomputer is unavailable (network)./]
	JRST	NETEQ
ICPEO:	HRROI	REG1,[ASCIZ/ The datacomputer is unavailable (down)./]
	JRST	NETEQ
ICPEC:	HRROI	REG1,[ASCIZ/ ?? ICP CLOSF failure ??/]
	JRST	NETEQ
ICPEOG:	HRROI	REG1,[ASCIZ/ ?? ICP output GTJFN failure ??/]
	JRST	NETEQ
ICPEIG:	HRROI	REG1,[ASCIZ/ ?? ICP input GTJFN failure ??/]
	JRST	NETEQ
ICPEIO:	HRROI	REG1,[ASCIZ/ ?? ICP output OPENF failure ??/]
	JRST	NETEQ
ICPEOO:	HRROI	REG1,[ASCIZ/ ?? ICP input OPENF failure ??/]
	JRST	NETEQ

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	HRLZI	REG1,100101	; OLD FILE, *'S, SHORT CALL
	MOVE	REG2,[point 7,LFILE]
	GTJFN
	 JRST	LOCOI1
	MOVEM	REG1,LJFN
	HRRZI	REG1,(REG1)
	MOVE	REG2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	HRROI	REG1,[ASCIZ/ (Local file not found.)
/]
	PSOUT
	RETURN
LOCOI2:	HRROI	REG1,[ASCIZ/ (Local file not available.)
/]
	PSOUT
	HRRZ	REG1,LJFN
	RLJFN
	 RETURN
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	HRLZI	REG1,600001	; VN, WRITE, SHORT
	MOVE	REG2,[point 7,LFILE]
	GTJFN
	 JRST	LOCOO2
	MOVEM	REG1,LJFN
	MOVE	REG2,[440000,,100000] ; 36 BIT BYTE, READ
	OPENF
	 JRST	LOCOO1
	RETURN	SKIP,1
LOCOO1:	HRRZ	REG1,LJFN
	RLJFN
	 JRST	.+1
LOCOO2:	HRROI	REG1,[ASCIZ/ ?? Local file creation failure ??
/]
	PSOUT
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	HRRZ	REG1,LJFN
	CLOSF
	 JRST	LOCC1
	RETURN
LOCC1:	HRROI	REG1,[ASCIZ/ ?? Local file CLOSE failure ??
/]
	PSOUT
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IOREG -- SIZE IN WORDS
;
LOCS:	BEGINR
	HRRZ	REG1,LJFN
	MOVE	REG2,[2,,11]	; READ 2 WORDS, OFFSET OF 11
	HRRZI	REG3,UBUF1
	GTFDB
	 JRST	.+3
	SETZ	IOREG,
	RETURN
	LDB	REG1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
	MOVEI	REG2,↑D36
	IDIVI	REG2,(REG1)	; BYTES/WD
	MOVE	REG3,UBUF1+1	; BYTE COUNT TO EOF
	ADDI	REG3,-1(REG2)	; ACCOUNT FOR TRUNCATION
	IDIVI	REG3,(REG2)	; NUMBER OF WORDS
	MOVE	IOREG,REG3
	ENDR

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR
	SETZM	GBUF1
	LDB	REG1,[350700,,FBUF]
	CAIN	REG1,"*"
	 SETOM	GBUF1
	SETZM	GBUF2
	LDB	REG1,[350700,,EBUF]
	CAIN	REG1,"*"
	 SETOM	GBUF2
	CALLR	LOCOI
	 RETURN
	CALLR	LOCC
	ENDR	SKIP,1

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR
	HRRZ	REG1,LJFN
	TLO	REG1,400000
	CLOSF
	 JRST	.+1
LOCNI1:	MOVE	REG1,LJFN
	GNJFN
	 RETURN	SKIP,1
	HRRZI	REG1,(REG1)
	MOVE	REG2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCNI1
	SKIPL	VSBUF
	 JRST	LOCNI2
	MOVE	REG1,[LFILE,,UBUF1]
	BLT	REG1,<UBUF1+SBSIZE-1>
LOCNI2:	HRROI	REG1,LFILE
	HRRZ	REG2,LJFN
	SETZ	REG3,
	JFNS
	HRROI	REG1,[ASCIZ/  /]
	PSOUT
	HRROI	REG1,LFILE
	PSOUT
	HRROI	REG1,CRLF
	PSOUT
	SKIPL	VSBUF
	 JRST	LOCNI5
	MOVE	REG1,[440700,,LFILE]
	MOVE	REG2,[440700,,UBUF1]
LOCNI3:	ILDB	REG3,REG1
	ILDB	REG4,REG2
	CAIE	REG3,(REG4)
	 JRST	LOCNI4
	CAIE	REG3,";"
	 JUMPN	REG3,LOCNI3
	AOS	VBUF
	JRST	LOCNI5
LOCNI4:	MOVN	REG1,VSBUF
	MOVEM	REG1,VBUF
LOCNI5:	SKIPN	GBUF1
	 JRST	LOCNI6
	HRROI	REG1,FBUF
	HRRZ	REG2,LJFN
	HRLZI	REG3,002000
	JFNS
LOCNI6:	SKIPN	GBUF2
	 RETURN
	HRROI	REG1,EBUF
	HRRZ	REG2,LJFN
	HRLZI	REG3,000200
	JFNS
	RETURN
	ENDR


; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR
	SETZ	REG1,
	SETO	REG2,
	CAMN	REG2,FSBUF
	 TRO	REG1,400000
	CAMN	REG2,ESBUF
	 TRO	REG1,200000
	CAMN	REG2,VSBUF
	 TRO	REG1,100000
	JUMPE	REG1,RETN(0)
	MOVE	REG2,[point 7,LFILE]
	MOVE	REG3,[point 7,FSBUF]
	TRNE	REG1,400000
	 HRRI	REG3,FBUF
	ILDB	REG4,REG3
	CAIN	REG4," "
	 SETZ	REG4,
	IDPB	REG4,REG2
	JUMPN	REG4,.-4
	SKIPN	ESBUF
	 JRST	LOCNO0
	MOVEI	REG4,"."
	DPB	REG4,REG2
	MOVE	REG3,[point 7,ESBUF]
	TRNE	REG1,200000
	 HRRI	REG3,EBUF
	ILDB	REG4,REG3
	CAIN	REG4," "
	 SETZ	REG4,
	IDPB	REG4,REG2
	JUMPN	REG4,.-4
LOCNO0:	SKIPG	VSBUF
	 RETURN
	MOVEI	REG4,";"
	DPB	REG4,REG2
	MOVE	REG1,REG2
	MOVE	REG2,VSBUF
	MOVEI	REG3,↑D10
	NOUT
	 THUD
	ENDR

; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI:	SETOM	FLAGCO
	DEBRK
EOFPSI:	SKIPN	FLAGEF
	 JRST	EOFPSE
	SETZM	FLAGEF
	DEBRK			; RETURN FROM INTERRUPT
EOFPSE:	MOVE	UTIL,REG1
	HRROI	REG1,[ASCIZ/ ?? UNEXPECTED EOF AT /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ/ ??
/]
	PSOUT
	MOVE	REG1,(REG2)
	CAMN	REG1,[BIN]
	 JRST	EOFPSD
	CAMN	REG1,[BOUT]
	 JRST	EOFPSD
	CAMN	REG1,[SIN]
	 JRST	EOFPSD
	CAMN	REG1,[SOUT]
	 JRST	EOFPSD
	MOVEI	REG1,PSIQUI
	MOVEM	REG1,PSIPC1
	DEBRK
EOFPSD:	CAMN	UTIL,DCDJFN
	 JRST	.+4
	MOVEI	REG1,PSIQUI
	MOVEM	REG1,PSIPC1
	DEBRK
	SETOM	FLAGDD
	MOVEI	REG1,QUIT
	MOVEM	REG1,PSIPC1
	DEBRK
DERPSI:	MOVE	UTIL,REG1
	HRROI	REG1,[ASCIZ/ ?? DATA ERROR AT /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ/ ??
/]
	PSOUT
	MOVE	REG1,(REG2)
	CAMN	REG1,[BIN]
	 JRST	DERPSD
	CAMN	REG1,[BOUT]
	 JRST	DERPSD
	CAMN	REG1,[SIN]
	 JRST	DERPSD
	CAMN	REG1,[SOUT]
	 JRST	DERPSD
	MOVEI	REG1,PSIQUI
	MOVEM	REG1,PSIPC1
	DEBRK
DERPSD:	CAMN	UTIL,DCDJFN
	 JRST	.+4
	MOVEI	REG1,PSIQUI
	MOVEM	REG1,PSIPC1
	DEBRK
	SETOM	FLAGDD
	MOVEI	REG1,QUIT
	MOVEM	REG1,PSIPC1
	DEBRK
ILIPSI:	HRRZ	REG1,PSIPC1
	MOVE	REG2,-1(REG1)
	CAMN	REG2,[GTFDB]
	 JRST	ILIPSD
	CAMN	REG2,[CHFDB]
	 JRST	ILIPSD
	HRROI	REG1,[ASCIZ/ ?? ILLEGAL INSTRUCTION AT /]
	CAMN	REG2,[-1]
	 HRROI	REG1,[ASCIZ/ ?? IMPOSSIBLE EVENT AT /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ/ ??
/]
	PSOUT
	MOVEI	REG1,PSIQUI
	MOVEM	REG1,PSIPC1
	DEBRK
ILIPSD:	HRROI	REG1,[ASCIZ/ (Bad local device.)
/]
	PSOUT
	AOS	PSIPC1
	DEBRK		; RETURN FROM INTERRUPT
PSIQUI:	HALTF
	JRST	PSIQUI
>
; (((↑↑↑)))


; ***DATA***

CRLF:	BYTE	(7)15,12,0,0,0
SEMI:	BYTE	(7)";",15,12,0,0

HOSTS:	5,,[ASCIZ/BBN/]			; TENEXE
	11,,[ASCIZ/HARVARD/]
	13,,[ASCIZ/SUAI/]
	37,,[ASCIZ/CCA/]
	53,,[ASCIZ/OFFICE"-1/]
	55,,[ASCIZ/SCI/]
	56,,[ASCIZ/RUTGERS/]
	61,,[ASCIZ/BBN/]		; TENEXB
	70,,[ASCIZ/SUMEX/]
	102,,[ASCIZ/AIC/]
	106,,[ASCIZ/ITS/]		; DMS
	126,,[ASCIZ/ISI/]		; ISI
	162,,[ASCIZ/BBN/]		; TENEXD
	206,,[ASCIZ/ITS/]		; AI
	226,,[ASCIZ/ISI/]		; ISIC
	305,,[ASCIZ/BBN/]		; TENEXA
	306,,[ASCIZ/ITS/]		; ML
	326,,[ASCIZ/ISI/]		; ISID
	354,,[ASCIZ/ITS/]		; MC
	361,,[ASCIZ/BBN/]		; TENEXC
	364,,[ASCIZ/ISI/]		; ISIB
	0

	LIT			; LITERALS GO HERE

; (((ITS)))
IFL F.TENX,<
IOBUFR:	BLOCK 2000
LCLDEV:	BLOCK 1			; local device
LCLFN1:	BLOCK 1
LCLFN2:	BLOCK 1
LCLSNM:	BLOCK 1			; SNAME
RCHBLK:	BLOCK 10		; network status goes here
LCLRCV:	BLOCK 1
LCLTRN:	BLOCK 1
FORRCV:	BLOCK 1
FORTRN:	BLOCK 1
FFITYP:	BLOCK 1
LCLDAT:	BLOCK 1
DIRBLK:	BLOCK 2000
>
; (((↑↑↑)))

; (((TOPS-10)))
IFE F.TENX,<
	RELOC	0

; (((NOT SAIL)))
IFE F.SAIL,<
ICPBLK:	SIXBIT	/IMP/
	0
	100			; LOCAL SOCKET
	40,,DCHOST		; 32 BIT BYTES (ICP), CCA HOST
	DCSOKT			; DATACOMPUTER SOCKET
DCIBLK:	SIXBIT	/IMP/
	0
	102			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP + 1
DCOBLK:	SIXBIT	/IMP/
	0
	103			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP
DCDBLK:	SIXBIT	/IMP/
	0
	0			; LOCAL SOCKET (104 RECEIVE, 105 SEND)
	44,,DCHOST		; 36 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP +2 OR +3
WRKBLK:	BLOCK	5
ICCHAS:	10			; IMAGE MODE
	SIXBIT	/IMP/
	0,,ICPBUF
ICPBUF:	BLOCK	3
DCCHAS:	0			; 7 BIT ASCII MODE
	SIXBIT	/IMP/
	DCOBUF,,DCIBUF
>
; (((↑↑↑)))
DCIBUF:	BLOCK	3
DCOBUF:	BLOCK	3
DDCHAS:	13			; BINARY
	SIXBIT	/IMP/
	DDOBUF,,DDIBUF
DDIBUF:	BLOCK	3
DDOBUF:	BLOCK	3

LFILE:	0			; LOCAL FILE NAME
	0			; EXTENSION
	0			; PROTECTION AND CREATION DATE
	0			; PROJ-PROG - 0 IS SELF
LFCHAS:	13			; BINARY MODE
	SIXBIT	/DSK/
	LFOBUF,,LFIBUF
LFIBUF:	BLOCK	3
LFOBUF:	BLOCK	3

LDIR:	0			; PROJ-PROG OF USER
	0			; "UFD"
	0
	0			; [1,1]
LDCHAS:	13
	SIXBIT	/DSK/
	0,,LDIBUF
LDIBUF:	BLOCK	3
LUTDSP:	0
LUTDSF:	BLOCK	SBSIZE

; (((SAIL)))
IFN F.SAIL,<
CONECB:	BLOCK 7

; OTHER RANDOM THINGS

TERBLK:	3			; TERMINATE BLOCK
	0			; STATUS BITS
	1			; FOREIGN SOCKET LOC
	0			; DON'T WAIT

STTBLK:	2
	BLOCK 2
>
; (((↑↑↑)))
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
LEVTAB:	PSIPC1
	PSIPC2
	PSIPC3
PSIPC1:	BLOCK	1
PSIPC2:	BLOCK	1
PSIPC3:	BLOCK	1
CHNTAB:	1,,TCOPSI
	REPEAT 9,<EXP 0>
	1,,EOFPSI
	1,,DERPSI
	REPEAT 3,<EXP 0>
	1,,ILIPSI
	REPEAT ↑D20,<EXP 0>
FLAGCO:	0
FLAGEF:	0

DCSOCK:	DCSOKT
ICPSOC:	0			; ICP SOCKET
DCIJFN:	0			; DC INPUT JFN
DCOJFN:	0			; DC OUTPUT JFN
DCDJFN:	0			; DC DATA JFN

LFILE:	BLOCK	SBSIZE
LJFN:	0
LDIR:	0

VSBUF:	0

PAGE:	BLOCK	SIZPAG
>
; (((↑↑↑)))

; * VARIABLES

CMDMOD:	0

LHOST:	0

ANCHOR:	ASCIZ	/DFTP/
	BLOCK	<SBSIZE-2>
CONTEX:	BLOCK	LBSIZE
OPENED:	BLOCK	LBSIZE
OPENEM:	0

FLAGDD:	0
FLAGDE:	0
FLAGTT:	-1

; * BLOCKS

NBUF:	BLOCK	LBSIZE
FBUF:	BLOCK	SBSIZE
EBUF:	BLOCK	SBSIZE
VBUF:	0
FSBUF:	BLOCK	SBSIZE
ESBUF:	BLOCK	SBSIZE

ABUF:	BLOCK	SBSIZE
UBUF1:	BLOCK	LBSIZE
UBUF2:	BLOCK	SBSIZE
GBUF1:	BLOCK	LBSIZE
GBUF2:	BLOCK	LBSIZE

NTIME:	0
NSIZE:	0
NSUM:	0

TCIPCL:	BLOCK	100		; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP:	0			; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
	BLOCK	37		;   (SIZE = # CHARS IN LARGEST CMD)
TCIPNF:	0			; P(OSSIBLE)N(EXT)F(REE)

	STSIZ==100
STBEG:	BLOCK	STSIZ

	-1			; CRETINOUS LINK-10 BUG


	END	DFTP
ββββ